hibernate sql查询
如果你跟我一样比较熟悉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查询的更多相关文章
- atitit。 hb Hibernate sql 查询使用
atitit. hb Hibernate sql 查询使用 #----------返回list<map>法..这个推荐使用. q.setResultTransformer(Tr ...
- hibernate sql查询转换成VO返回list
hibernate sql查询转换成VO @Override public List<FenxiVo> getTuanDuiFenxiList(FenxiVo FenxiVo,Intege ...
- Hibernate SQL查询 addScalar()或addEntity()
本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询. 对原 ...
- hibernate sql查询后对象转换成实体类
在多表查询的时候使用hibernate的sql查询的时候,一般返回的是object[]数组,或者可以使用 session.createSQLQuery(sql).setResultTransform ...
- 笔记:Hibernate SQL 查询
Hibernate 支持使用原生的SQL查询,使用原生SQL查询可以利用某些数据库特性,原生SQL查询也支持将SQL语句放在配置文件中配置,从而提高程序的解耦,命名SQL查询还可以用于调用存储过程. ...
- Hibernate SQL查询 addScalar()或addEntity()【转】
本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询. 对原 ...
- Hibernate SQL 查询
本文转载自:https://www.cnblogs.com/li3807/p/6358386.html Hibernate 支持使用原生的SQL查询,使用原生SQL查询可以利用某些数据库特性,原生SQ ...
- Hibernate原生SQL查询
最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...
随机推荐
- #Leet Code# Sqrt
描述:log(n) 代码: class Solution: # @param x, an integer # @return an integer def getVal(self, begin, en ...
- Linux发行版
Linux 发行版(英语:Linux distribution,也被叫做GNU/Linux 发行版),为一般用户预先集成好的Linux操作系统及各种应用软件.一般用户不需要重新编译,在直接安装之后,只 ...
- C++程序的构成和书写形式
C++程序的结构和书写格式归纳如下: (1) 一个C++程序可以由一个程序单位或多个程序单位构成.每一个程序单位作为一个文件.在程序编译时,编译系统分别对各个文件进行编译,因此,一个文件是一个编译单 ...
- csu 10月 月赛 D 题 CX and girls
Description CX是要赶去上课,为了不迟到必须要以最短的路径到达教室,同时CX希望经过的路上能看到的学妹越多越好.现在把地图抽象成一个无向图,CX从1点出发,教室在N号点,告诉每个点上学妹的 ...
- eclipse安装CDT插件遇到的问题
转自eclipse安装CDT插件遇到的问题 已经安装了集成java版本的eclipse,eclipse-java-indigo-SR1-win32.zip,在添加CDT插件时,遇到了问题. cdt-m ...
- fzu 2037 Maximum Value Problem
http://acm.fzu.edu.cn/problem.php?pid=2037 思路:找规律,找出递推公式f[n]=f[n-1]*n+(n-1)!,另一个的结果也是一个递推,s[n]=s[n-1 ...
- Tabhost嵌套以及Tab中多个Activity跳转的实现
做了一个demo,先看看效果图: 源码 如下: () DoubleTabHost package yy.android.tab; import android.app.TabActivity; imp ...
- POJ_1065_Wooden_Sticks_(动态规划,LIS+鸽笼原理)
描述 http://poj.org/problem?id=1065 木棍有重量 w 和长度 l 两种属性,要使 l 和 w 同时单调不降,否则切割机器就要停一次,问最少停多少次(开始时停一次). Wo ...
- BZOJ2038小Z的袜子(hose)
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2343 Solved: 1077[Subm ...
- c++ lambda返回类型自动推导的一些需要注意的地方
一句话,lambda返回类型自动推导走的是auto,而不是decltype,注意. class ObjectA { public: ObjectA() { val_ = ++g; } ObjectA( ...