Hibernate5.2之原生SQL查询

Hibernate5.2之原生SQL查询

一. 介绍

   在上一篇博客中笔者通过代码的形式给各位读者介绍了Hibernate中最重要的检索方式--HQL查询。在本博文中笔者将向各位读者介绍Hibernate中的原生SQL查询,虽为原生SQL查询,但是笔者认为Hibernate在针对不同的数据库在分页语句的处理上做的很不错,我们不用去关心使用的是何种的数据库。本博文会沿用《Hibernate5.2之HQL查询》中的POJO类和配置文件,请各位看官在阅读本博文之前请先阅读该文章,本篇文章会将HQL中涉及的相关操作原封不动的全部改为SQL查询,所以在代码上的重复度比较的高,请各位读者勿喷,那我们就直接上单元测试了。

二. 单元测试

A.获取所有的Order对象,得到一个List集合

@Test
public void list(){
    String sql = "select * from orders";
    NativeQuery<Order> query = session.createNativeQuery(sql, Order.class);
    List<Order> list = query.getResultList();
    for(Order o : list){
         System.out.println(o.getId() + "::" + o.getOrderId());
    }
}

B.获取Order的分页数据,得到一个List集合

/**
 * 虽然为原生的SQL查询,但是依然可以使用setFirstResult()和setMaxResults()方法。从而屏蔽了
 * 底层数据库的差异性。
 */
@Test
public void pageList(){
    String sql = "select * from orders";
    //setFirstResult()从0开始
    Query<Order> query = session.createNativeQuery(sql, Order.class).setFirstResult(1).setMaxResults(4);
    List<Order> list = query.getResultList();
    for(Order o : list){
         System.out.println(o.getId());
    }
}

C.多条件查询,返回List集合(第一种形式:索引占位符)

@Test
public void multiCretiera(){
    String sql = "select * from orders where create_time between ? and ? and order_id like ?";
    Query<Order> query = session.createNativeQuery(sql, Order.class);
    String beginDateStr = "2016-07-26 00:00:00";
    String endDateStr = "2016-07-28 23:59:59";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    Date beginDate = null;
    Date endDate = null;
    try {
         beginDate = sdf.parse(beginDateStr);
         endDate = sdf.parse(endDateStr);
    } catch (ParseException e) {
         e.printStackTrace();
    }
    //分页从0开始
    query.setParameter(0, beginDate).setParameter(1, endDate).setParameter(2, "%D%").setFirstResult(0).setMaxResults(1);
    List<Order> list = query.getResultList();
    for(Order o : list){
         System.out.println(o.getOrderId() + "::" + o.getCreateTime());
    }
}

D.多条件查询,返回List集合(第二种形式:命名占位符)

@Test
public void multiCretiera1(){
    String sql = "select * from orders where order_id like :orderId and create_time between :beginDate and :endDate";
    Query<Order> query = session.createNativeQuery(sql, Order.class);
    String beginDateStr = "2016-07-26 00:00:00";
    String endDateStr = "2016-07-28 23:59:59";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    Date beginDate = null;
    Date endDate = null;
    try {
         beginDate = sdf.parse(beginDateStr);
         endDate = sdf.parse(endDateStr);
    } catch (ParseException e) {
         e.printStackTrace();
    }
    query.setParameter("orderId", "%D%").setParameter("beginDate", beginDate).setParameter("endDate", endDate);
    List<Order> list = query.getResultList();
    for(Order o : list){
         System.out.println(o.getId() + "::" + o.getOrderId());
    }}

E.大于条件的查询,使用索引占位符

@Test
public void gt(){
    String sql = "select * from orders where id > ?";
    Query<Order> query = session.createNativeQuery(sql, Order.class).setParameter(0, 3);
    List<Order> list = query.getResultList();
    for(Order o : list){
        System.out.println(o.getId() + "::" + o.getOrderId());
    }
}

F.删除操作

@Test
public void delete(){
    String sql = "delete from orders where id in (:idList)";
    Transaction tx = session.beginTransaction();
    List<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    Query<?> query = session.createNativeQuery(sql).setParameter("idList", list);
    int i = query.executeUpdate();
    System.out.println(i);
    tx.commit();
    session.close();
}

G.获取某一列的值

@Test
public void singleValue(){
    String sql = "select order_id from orders";
    Query<String> query = session.createNativeQuery(sql);
    List<String> list = query.getResultList();
    for(String str : list){
        System.out.println(str);
    }
}

H.获取关联对象的结果集

@Test
public void getCustomer(){
    String sql = "select c.* from orders o join customer c on o.customer_id = c.id where c.id = 8";
    Query<Customer> query = session.createNativeQuery(sql, Customer.class);
    List<Customer> list = query.getResultList();
    for(Customer o : list){
        System.out.println(o.getId() + ";;");
    }
}

I.多列数据的查询

@Test
public void getObjectArray(){
    String sql = "select c.name, c.phone_number, o.order_id, o.create_time from orders o join customer c on o.customer_id = c.id";
    Query<Object[]> query = session.createNativeQuery(sql);
    List<Object[]> list = query.getResultList();
    for(Object[] o : list){
         System.out.println(o[0] + ";;" + o[1] + ";;" + o[2]);
    }
}

J.函数查询

@Test
public void functionQuery(){
    String sql = "select max(id), count(*) from orders";
    Query<Object[]> query = session.createNativeQuery(sql);
    Object[] obj = query.getSingleResult();
    System.out.println(obj[0] + "::" + obj[1]);
}

K.排序

@Test
public void descQuery(){
    String sql = "select * from orders order by id desc";
    Query<Order> query = session.createNativeQuery(sql, Order.class);
    List<Order> list = query.getResultList();
    for(Order o : list){
        System.out.println(o.getId() + "::" + o.getOrderId());
    }
}

L.右连接

@Test
public void rightJoin(){
    String sql = "select c.* from orders o right join customer c on o.customer_id = c.id";
    Query<Customer> query = session.createNativeQuery(sql, Customer.class);
    List<Customer> list = query.getResultList();
    for(Customer c : list){
        System.out.println(c.getId());
    }
}

上一篇:Hibernate5.2之HQL查询

时间: 2024-12-17 07:21:23

Hibernate5.2之原生SQL查询的相关文章

使用hibernate原生sql查询,结果集全为1的问题解决

问题如下: String sqlTest ="select summary,summaryno from F_Summary"; List<Map<Object, Object>> listTest = this.getService().getListBySql(sqlTest); for (Map<Object, Object> m : listTest) { for (Object k : m.keySet()) { System.out.pr

Hibernate 的原生 SQL 查询

Hibernate除了支持HQL查询外,还支持原生SQL查询.         对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.该接口是Query接口的子接口.         执行SQL查询步骤如下:         1.获取Hibernate Session对象         2.编写SQL语句         3.通过Session的createSQLQuery方法创建查询对象         4.调用SQ

hibernate使用原生SQL查询返回结果集的处理

今天没事的时候,看到公司框架里有一个用原生SQL写的函数,说实在以前自己也干过这事,但好久都没有用,都忘得差不多了,现在基本都是用的hql语句来查询结果.hibernate中使用createSQLQuery拉来来实现SQL语句的查询,具体用法:session.createSQLQuery(sql),对于用SQL返回的结果集是一个什么样的结果集都毫无记忆.自己查了下,才知道,原来是返回一个Object类型数组的list集合,而其中Object类型的数组里的值则与sql语句中的查询项相对应,如果是s

Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1

第一篇:官方文档的处理方法,摘自官方 在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持. 1.使用SQLQuery hibernate对原生SQL查询执行的控制是通过SQLQuery接口进行的. Session.createSQLQuery(); 1.1标量查询 最基本的SQL查询就是获得一个标量(数值)的列表. sess.createSQLQuery("SELECT * FROM CATS").list(); sess.createSQL

Hibernate原生SQL查询多表关联,SQL语句要注意的问题

Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Question 和 Answer分别对应数据表 question 和answer. 并且表 question 和answer 的字段大部分都一样,字段数目也一样. 执行如下的操作: 1> 使用hibernate 使用原生SQL查询, Query q = session.createSQLQuery(sql).

Hibernate 的SQLQuery接口addScalar方法 (原生sql查询)

在平时开发中Hibernate提供的hql基本能够满足我们的日常需求.但是在有些特殊的情况下,还是需要使用原生的sql,并且希望sql查询出来的结果能够绑定到pojo上.hibernate API中的createSQLQuery  和createQuery接口. 就像在这次的项目中,因为表结构要变化,有个新的需求: 要从一个表中查询极个别的字段并且还有几个是求多条数据的和的,之前一直在使用hibernate的API,使用的都是映射过得对象. 原对象及表结构是这样的: @Entity @Table

Hibernate 使用原生SQL查询无法使用别名问题

最近遇到一个问题就是Hibernate在使用原生SQL进行多表联合查询别名的问题,一直报错,说是找不到某列,经过向别人咨询最后得出了解决方案 需要向数据库连接字符串中加入属性,具体如下 common.db.driverClassName=com.mysql.jdbc.Driver common.db.url=jdbc:mysql://10.10.11.8:3306/cm_mini_1?useOldAliasMetadataBehavior=true common.db.username=user

slick for play 使用原生sql查询以及拼接sql

在play中用函数式框架slick来操作数据库是一件很爽的事情.但有时因为某些特殊场景又不得不用原生的sql了. 还好slick支持这种写法,可以看看slick官方文档,Slick Plain SQL queries http://slick.lightbend.com/doc/3.1.1/sql-to-slick.html#slick-plain-sql-queries 下面说说我的场景,我的一个系统中有一个表格,由于用这个系统的也都是技术人员,为了方便就直接在表格上面开放了一个sql查询框,

springDataJPQL实现增删改查及分页,原生sql查询,根据方法命名规则实现查询

一.使用方法 1.在dao中定义开一个方法,使用方法的参数设置jpql,并且使用方法的返回值接受查询结果,在方法上添加@query注解,在注解中写jpql语句进行增删改查,测试 2.使用原生的sql语句:dao中定义一个方法,在方法中添加@query注解,在注解中添加原生sql语句,并且添加一个属性:nativeQuery=true,测试 3.方法命名规则查询: 通过以肯定的规则,定义一个方法,框架本身就可以根据方法名生成一块个sql语句进行查询,规则: 1.必须以findBy开头 2.查询某个