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查询

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

  1. hibernate 5原生sql查询测试学习代码

    基本查询 import java.util.List; import org.hibernate.SQLQuery; import org.hibernate.Session; import org. ...

  2. Hibernate原生SQL查询

    最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...

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

    Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...

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

    今天没事的时候,看到公司框架里有一个用原生SQL写的函数,说实在以前自己也干过这事,但好久都没有用,都忘得差不多了,现在基本都是用的hql语句来查询结果.hibernate中使用createSQLQu ...

  5. JavaEE(18) - JPA原生SQL查询和存储过程

    1. 使用原生SQL执行查询 2. 映射原生SQL查询的结果集 3. 使用原生SQL查询执行实体查询 4. 命名原生SQL查询 5. 在JPQL查询中调用存储过程

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

    第一篇:官方文档的处理方法,摘自官方 在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持. 1.使用SQLQuery hibernate对原生SQL查询执行 ...

  7. Hibernate 的原生 SQL 查询

    Hibernate除了支持HQL查询外,还支持原生SQL查询.         对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取 ...

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

    问题如下: String sqlTest ="select summary,summaryno from F_Summary"; List<Map<Object, Ob ...

  9. django原生sql查询如何返回字典格式

    django原生sql查询,默认返回的是元祖.如果想返回字典格式,需要自行封装: http://www.360doc.com/content/17/0802/11/9200790_676042880. ...

随机推荐

  1. JVM实用参数——新生代垃圾回收

    JVM实用参数目录 JVM实用参数——新生代垃圾回收 概述 第1部分  新生代垃圾回收介绍 第2部分 参数介绍 参考 第1部分  新生代垃圾回收介绍 本部分,我们将关注堆(heap) 中一个主要区域, ...

  2. 读《程序员的SQL金典》[3]--表连接、子查询

    一.表连接-JOIN 1. 自连接实例 查询类型相同的订单信息. SELECT O1 .*,O2.* FROM T_Order O1 JOIN T_Order O2 ON O1 .FTypeId= O ...

  3. ios基础篇(二十)—— UIBezierPath绘制

    UIBezierPath类可以创建基于矢量的路径,可以定义简单的形状,如椭圆或者矩形,或者有多个直线和曲线段组成的形状. 一.UIBezierPath使用: 1.创建path: 2.添加路径到path ...

  4. react native ScrollView

    ScrollView是一个通用的可滚动的容器,你可以在其中放入多个组件和视图,而且这些组件并不需要是同类型的.ScrollView不仅可以垂直滚动,还能水平滚动(通过horizontal属性来设置). ...

  5. Oracle 字符串分割排序冒泡算法

    例子: 一个字符串"11,15,13,17,12",以逗号分割,现在要排序成"11,12,13,15,17". 写了一个实现方法,记录下来以备后用: ----- ...

  6. z-index、display、selector选择器优先级css优先级面试用到

    z-index:控制元素叠放顺序,哪个z-index数值越大,那个优先被叠放在上面. relative.absolute.fixed这三种情况可以使用z-index. static不可以使用. dis ...

  7. CentOS修改默认编码为UTF-8,使java程序字符集默认为UTF-8

    java程序在本地接受php的utf8字符串好好的,到了服务器就行了. 解决,修改vi /etc/sysconfig/i18n,修改之后ssh断开,重连后KILL你的java. LANG=" ...

  8. ios中通知的简单使用

    通知的机制是一对多,而block和delegate的机制是一对一,通知是好用,但小伙伴么要记得通知比较耗性能哦~~~ 谁要发送消息,谁就发出通知,谁要接受消息,谁就销毁通知. 下面直接来看代码: // ...

  9. phonegap 框架详解

    首先, 来看一下phonegap 初始化流程以及Native 与 JS 交互流程图. 说明:socket server模式下, phonegap.js 源码实现的采用1 毫秒执行一次XHR请求,  当 ...

  10. codeforces 706D (字典树)

    题目链接:http://codeforces.com/problemset/problem/706/D 题意:q次操作,可以向多重集中增添,删除,询问异或最大值. 思路:转化为二进制用字典树存储,数字 ...