如果你跟我一样比较熟悉SQL,同时不想学习一门新的语言。那么在hibernate中使用Native SQL 查询也是一种不错的方式。

  • 一方面,Native SQL在效率方面有天生的优势;
  • 另一方面,SQL是数据库操作的一种标准,我们与程序、数据库关联很小。如果将来不用hibernate,而是用别的ORM,sql一样好用。

但尽量用标准SQL,而不要用过多方言SQL。

标量查询

最基本的 SQL 查询就是获得一个标量(数值)的列表。

sess.createSQLQuery("SELECT * FROM USER").list();
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM USER").list();

它们都将返回一个 Object 数组(Object[])组成的 List,数组每个元素都是 USER 表的一个字段值。Hibernate 会使用 ResultSetMetadata 来判定返回的标量值的实际顺序和类型。

如果不需要在后台进行复杂的处理,可直接将list<Object[]> 转化为json,交给前台去处理。在处理json时,按照数组的方式遍历一个item的属性,属性值为空对应null。

例如我们前台需要一个json格式的包含userName,address,phone的UserInfo列表,而并不需要account、password等隐私信息。

    public List<Object> findUserInfo(){
Session session=HibernateUtil.currentSession();
Transaction tx = null;
List<Object> infolist=null;
try {
tx=session.beginTransaction();
Query query=session.createSQLQuery("select userName,address,phone from user");
infolist=query.list();
tx.commit();
} catch (HibernateException e) {
throw e;
}
return infolist;
}

实体查询

上面的查询都是返回标量值的,也就是从 resultset 中返回的“裸”数据。下面展示如何通过

addEntity() 让原生查询返回实体对象。

sess.createSQLQuery("SELECT * FROM USER").addEntity(User.class);
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM USER").addEntity(User.class);

这个查询指定:

  • SQL 查询字符串
  • 要返回的实体

返回单个实体

根据id查询实体:

    public User getById(Integer id) {
Session session=HibernateUtil.currentSession();
Transaction tx = null;
User user=null;
try {
tx=session.beginTransaction();
user=(User) session.get(User.class, id);
tx.commit();
} catch (HibernateException e) {
tx.rollback();
throw e;
}
return user;
}

根据unique属性查询实体:

    public User findUniqueByProperty(String propertyName,String value) {
Session session=HibernateUtil.currentSession();
Transaction tx = null;
User user = null;
try {
tx=session.beginTransaction();
Query query=session.createQuery("from User where "+propertyName+"=?");
query.setString(0, value);
user=(User)query.uniqueResult();
tx.commit();
} catch (HibernateException e) {
tx.rollback();
throw e;
}
return user;
}

返回一个集合

    public List<User> findAll() {
Session session=HibernateUtil.currentSession();
Transaction tx = null;
List<User> userlist=null;
try {
tx=session.beginTransaction();
Query query=session.createSQLQuery("select * from user").addEntity(User.class);
userlist=query.list();
tx.commit();
} catch (HibernateException e) {
tx.rollback();
throw e;
}
return userlist;
}

分页查询

如果你需要指定结果集的范围(希望返回的最大行数/或开始的行数),分别应该使用 Query 接口提供的方法:setFirstResult(int firstResult)、setMaxResults(int maxResults)。

分页查询是这种应用的一个特殊情况,一页代表从数据库某一行开始到某一行结束的结果集。

Query query=session.createSQLQuery("SELECT * FROM USER");
query.setFirstResult((pageIndex - 1) * pageSize);//结果集的起始行
query.setMaxResults(pageSize); //结果集的最大记录数,也就是一页的记录数

下面是一个实例:

    public List<LogDetail> pageQuery(int pageIndex, int pageSize, int adminId) {
Session session = HibernateUtil.currentSession();
Transaction tx = null;
List<LogDetail> logDetailList = null;
try {
tx = session.beginTransaction();
Query query = session
.createSQLQuery(
"select logdetail.* from logdetail INNER JOIN useradmin on logdetail.userId=useradmin.userId "
+ "where adminId=" + adminId +" order by logDate desc")
.addEntity(LogDetail.class);
query.setFirstResult((pageIndex - 1) * pageSize);
query.setMaxResults(pageSize);
logDetailList = query.list();
tx.commit();
} catch (HibernateException e) {
tx.rollback();
throw e;
}
return logDetailList;
}

hibernate sql查询的更多相关文章

  1. atitit。 hb Hibernate sql 查询使用

    atitit. hb  Hibernate sql 查询使用 #----------返回list<map>法..这个推荐使用.      q.setResultTransformer(Tr ...

  2. hibernate sql查询转换成VO返回list

    hibernate sql查询转换成VO @Override public List<FenxiVo> getTuanDuiFenxiList(FenxiVo FenxiVo,Intege ...

  3. Hibernate SQL查询 addScalar()或addEntity()

    本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询.          对原 ...

  4. hibernate sql查询后对象转换成实体类

    在多表查询的时候使用hibernate的sql查询的时候,一般返回的是object[]数组,或者可以使用  session.createSQLQuery(sql).setResultTransform ...

  5. 笔记:Hibernate SQL 查询

    Hibernate 支持使用原生的SQL查询,使用原生SQL查询可以利用某些数据库特性,原生SQL查询也支持将SQL语句放在配置文件中配置,从而提高程序的解耦,命名SQL查询还可以用于调用存储过程. ...

  6. Hibernate SQL查询 addScalar()或addEntity()【转】

    本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询.          对原 ...

  7. Hibernate SQL 查询

    本文转载自:https://www.cnblogs.com/li3807/p/6358386.html Hibernate 支持使用原生的SQL查询,使用原生SQL查询可以利用某些数据库特性,原生SQ ...

  8. Hibernate原生SQL查询

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

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

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

随机推荐

  1. CGDataCmd

    1,"Get Inf Joint from file" 选择文件中储存的骨骼信息; 2,"Export skinWeight"   导出权重;  3," ...

  2. iOS Copy 和 MutableCopy的区别 深浅拷贝的区别-供参考

    概述 对于系统的非容器类对象,对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝).如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的. 对于 ...

  3. C连接MySQL数据库开发之Linux环境完整示例演示(增、删、改、查)

    一.开发环境 ReadHat6.3 32位.mysql5.6.15.gcc4.4.6 二.编译 gcc -I/usr/include/mysql -L/usr/lib -lmysqlclient ma ...

  4. java版 正文抽取 基于文字连接比

    package cn.tdt.crawl.jdbc; import java.util.regex.Matcher; import java.util.regex.Pattern; import or ...

  5. Linux 下编译、安装、配置 QT

    转自Linux 下编译.安装.配置 QT 注意:编译安装耗时费力,且很容易出错,要不断调整编译参数,不推荐使用,否则这将会是一个纠结痛苦的过程. 打算做嵌入式图像处理,计划方案嵌入式Linux+Ope ...

  6. TEA算法

    我们要讨论的最后一个分组密码加密算法是TEA(Tiny Encryption Algorithm).到目前为止,我们在前面所呈现的连线图可能会使你得出如下结论:分组密码加密算法必须是复杂的.TEA却能 ...

  7. delphi非IE内核浏览器控件TEmbeddedChrome下载|TEmbeddedChrome代码

    下载地址: 点击下载 代码示例: 在TForm的oncreate方法中写入一些代码 procedure TForm1.FormCreate(Sender: TObject); begin Chromi ...

  8. 【HDOJ】2544 最短路

    Dijkstra. #include <stdio.h> #include <string.h> #define INF 0xfffffff ][]; ]; ]; int ma ...

  9. ☀【JS组织】pageA_init, pageB_init

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  10. 使用 Puppet 在 Windows Azure 中配备 Linux 和 Windows 环境

     发布于 2013-12-11 作者 Ross Gardler 微软开放技术有限公司 (MS Open Tech) 很高兴地宣布发行新的 Windows Azure Puppet 模块.通过这个模 ...