如果你跟我一样比较熟悉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. [转]Vim 复制粘贴探秘

    Vim作为最好用的文本编辑器之一,使用vim来编文档,写代码实在是很惬意的事情.每当学会了vim的一个新功能,就会很大地提高工作效率.有人使用vim几十年,还没有完全掌握vim的功能,这也说明了vim ...

  2. 黑马程序员-------.net基础知识二

    变量 变量代表着一块内存空间,我们可以通过变量名称想内存存/取数据,有变量就不需要我们记忆复杂的内存地址. 向内存中申请一块内存空间的语法:   数据类型 变量名; 变量类型 变量类型 存储位置 自动 ...

  3. 【转】mybatis 获取自增id

    转自:http://www.cnblogs.com/rhythmK/p/4047142.html 1.环境: mybatis : 3.2.3 spring-mybatis:  1.2.1 mysql: ...

  4. TCP/IP入门学习(1)---分层概述

    本文旨在记述一些学习中的笔记 OSI分层:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层 详细点: 1.应用层:为应用程序提供服务并规定程序中通信相关细节. 2.表示层:将应用处理的信息转 ...

  5. 多个div独立控制其显示/隐藏

    今天要说一个神奇的html标签op,静态页下可以配合jquery分别控制每个层的显示/隐藏切换. 如果用动态中使用,用文章id做区分就可以了. <html> <head> &l ...

  6. bzoj 1023: [SHOI2008]cactus仙人掌图 tarjan缩环&&环上单调队列

    1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1141  Solved: 435[Submit][ ...

  7. 【技术贴】Maven打包文件增加时间后缀

    构建war包,或者jar包的,时候,maven会自动增加一个版本号和时间放在jar包后面比如poi-3.9-20131115.jar这样子,但是我自己打war包,总是给我生成一个快照的后缀report ...

  8. Mongodb与关系型数据库

    MongoDB没有固定的关系约束 没有事务, 安全性不高 不一定保证数据的一致性. ACID不符合 NoSQL 放弃了传统关系型数据库严格的事务一致性和范式约束,采用弱一致性模型. http://os ...

  9. 一周一话题之三(Windows服务、批处理项目实战)

    -->目录导航 一. Windows服务 1. windows service介绍 2. 使用步骤 3. 项目实例--数据上传下载服务 二. 批处理运用 1. 批处理介绍 2. 基本语法 3. ...

  10. [mock]10月4日

    第一次mock,CollabEdit开一个页面,开始做题.题目是,有方法pow(m,n),m和n都大于1,给出N,有顺序的打印出前N个pow(m,n)的结果.前一个是:4,8,9,16,... 然后在 ...