hibernate的查询方式有HQL,Cretiria和SQL.
hql查询面向对象的语句风格确实要简洁一些(只是那么一点),
cretiria本人目前没在项目中使用过.
有一半的时候, 我在Hibernate框架中使用的是SQL查询,
简单,可控, 原生. 使用起来风格原始,简单有效, 不增加学习成本,且利于多人开发的维护.
Hibernate提供一个接口SQLQuery, 用于支持原生sql语句查询.
package com.hbt3.app;
import java.util.List;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.transform.Transformers;
import com.hbt3.entity.User;
import com.hbt3.entity.UserDto;
import com.hbt3.utils.HibernateUtil;
/**
* @description hibernate SQLQuery原生sql查询
* @author huangjc
* @date 2016年12月17日 20:46:07
*/
public class HibernateSQLQuery {
public static void main(String[] args) {
query1(); //SQLQuery查询返回List<Object[]>
query2(); //SQLQuery.addEntity(User.class)查询返回List<User>
query3(); //SQLQuery.addScalar("userId");sqlQuery.setResultTransformer(Transformers.aliasToBean(UserDto.class));查询返回List<UserDto>
//query4(); //sqlQuery.setResultSetMapping(arg0) 查询返回关联结果集
}
// 查询返回List<Object[]>
public static void query1() {
Session session = HibernateUtil.getSession();// 获取session会话对象
session.beginTransaction();// 开始一个事务
String sql = "select * from t_user t where t.name = ?";
SQLQuery sqlQuery = session.createSQLQuery(sql);// SQLQuery是hibernate用于支持原生sql的接口类
sqlQuery.setParameter(0, "黑蜗牛");
/这里查出来的是LIST<Object[]>, list里面装的是Object类型的数组
List userList = sqlQuery.list();
System.out.println("查询到" + userList.size() + "条结果.");
for(Object obj: userList) {//需要for循环遍历取数据
Object[] objArray = (Object[]) obj;
System.out.println("----id:"+ objArray[0] + "----userId:" + objArray[1]
+ "----name:" + objArray[2] + "----password:" + objArray[3] + "----preference:" + objArray[4]);
}
session.getTransaction().commit();
}
//查询返回List<User>
public static void query2(){
Session session = HibernateUtil.getSession();// 获取session会话对象
session.beginTransaction();// 开始一个事务
String sql = "select * from t_user t where t.name = ?";
SQLQuery sqlQuery = session.createSQLQuery(sql);// SQLQuery是hibernate用于支持原生sql的接口类
sqlQuery.setParameter(0, "黑蜗牛");
// /这里查出来的是t_user对应的User对象,字段一一对应,数量和类型必须都一致
sqlQuery.addEntity(User.class);
List<User> userList = (List<User>)sqlQuery.list();
System.out.println("查询到" + userList.size() + "条结果.");
for (User user : userList) {// 需要for循环遍历取数据
System.out.println("----id:" + user.getId() + "----userId:" + user.getId() + "----name:" + user.getName()
+ "----password:" + user.getPassword() + "----preference:" + user.getPreference());
}
session.getTransaction().commit();
}
//查询返回List<UserDto>
public static void query3(){
Session session = HibernateUtil.getSession();// 获取session会话对象
session.beginTransaction();// 开始一个事务
String sql = "select t.user_id userId, t.name from t_user t where t.name = ?";
SQLQuery sqlQuery = session.createSQLQuery(sql);// SQLQuery是hibernate用于支持原生sql的接口类
sqlQuery.setParameter(0, "黑蜗牛");
sqlQuery.addScalar("userId");//*************************特别注意:addScalar一旦使用, 那么就会严格按照addScalar的列来返回, 其他列是不存在不返回的,null都没有!!
sqlQuery.addScalar("name");
// /这里查出来的是不受hibernate管理的自定义DTO对象
sqlQuery.setResultTransformer(Transformers.aliasToBean(UserDto.class));
List<UserDto> userList = (List<UserDto>)sqlQuery.list();
System.out.println("查询到" + userList.size() + "条结果.");
for (UserDto userDto : userList) {// 需要for循环遍历取数据
System.out.println("----userId:" + userDto.getUserId() + "----name:" + userDto.getName());
}
session.getTransaction().commit();
}
//占个位,有空再来写sqlQuery.setResultSetMapping(arg0)
//sqlQuery.setResultSetMapping(arg0)是结合配置文件一起工作的, 适用于返回复杂的结果集
public static void query4(){
}
}
控制台打印:
Hibernate: select * from t_user t where t.name = ?
查询到1条结果.
----id:FDF619898A604005B647B5B4D70CEE4A----userId:002----name:黑蜗牛----password:hwn----preference:蜗牛
Hibernate: select * from t_user t where t.name = ?
查询到1条结果.
----id:FDF619898A604005B647B5B4D70CEE4A----userId:FDF619898A604005B647B5B4D70CEE4A----name:黑蜗牛----password:hwn----preference:蜗牛
Hibernate: select t.user_id userId, t.name from t_user t where t.name = ?
查询到1条结果.
----userId:002----name:黑蜗牛
***-- 正道崎岖, 风雨兼程.***