hibernate我学到一半就没学了,于是在代码中闹出这样的笑话,看到人间写的代码中写的是:
Query query=session.createQuery(hql);
hql="from user";
然后使用query.list()[得到一个对象的list集合] 和query.uniqueResult()【得到一个对象】
我有点莫名,怎么不加select呢?原来这是hibernate是这样的:
createQuery只能用hql语句,要用sql语句(也就是说的select * )应该使用session.createSQLQuery(sql);
当然createQuery方法也是可以加Select 的, 不过如果要加select的话,需要有明确的构造函数。举个例子
比如一个实体类UserInfo有三个字段:id,name,gender。如果你要使用select的话就需要声明一个构造函数
public UserInfo(int id, String name, int gender) {}
然后就是getSession().createQuery("select new UserInfo(id, name, gender) from UserInfo");当然还有另外的写法,见下方!!
还有,上面加select和不加select写的语句查询出来的东西有什么区别吗??
这里是这样的,因为在网上看到有网友说:使用select的语句返回的是个单纯的数组,不能被转换为bean对象,强转出错,尔不写select的返回结果是个可以被转换的数组。
我的理解是这样的,这句话说的很抽象,根本没有到点子上去,为什么它不能转换为bean对象,那么肯定是不能匹配构造函数呗,因为加了select语句后你要么选出的是指定的字段select u.name from User as u!/当然加多个属性的时候见下方,这个时候必要的操作是在实体bean中要生成你所查询字段汇总的构造函数!!而不加select的时候hibernate会自动根据查询数据映射为一个对象的!!heihei!如果有错误希望大家更正一起讨论哈
给出一查询的汇总!!
HQL:特点:语法类似sql,使用面向对象的封装,直接返回对象或对象数组
1.查询整个实体对象(不加select)
String hql="from com.mypack.User4"; Query query=session.createQuery(hql);
List lists=query.list(); for(int i=0;i< lists.size();i++){
User4 user=(User4)lists.get(i); System.out.println(user.getId()); }
或者: for(Iterator iter=users.iterator();iter.hasNext();){
User4 user=(User4)iter.next(); }
2.查询单个属性(返回单个属性类型): hql="select u.name from User4 u";
query=session.createQuery(hql); List names=query.list();//执行查询
for(int i=0;i String name=(String)names.get(i); }
3.1查询多个属性返回对象数组的集合: hql="select u.name,u.age from User4 u";
query=session.createQuery(hql); List names=query.list();//一步步转型
for(int i=0;i Object[ ] object=(Object[])names.get(i);
String name=(String)object[0]; Integer age=(Integer)object[1];
3.2也可以将多个属性用单个属性替代:hql="select new User4(u.name,u.age) from User4 u";
query=session.createQuery(hql); List names=query.list();
for(int i=0;i User4 user=(User4)names.get(i); }
注:需要在User4中添加User4(name,age)构造函数,同时添加无参构造函数防止影响其他代码
4.聚合函数也可以使用: hql="select count(*) from User4 u";
query=session.createQuery(hql); int count=(Integer)query.list().get(0);
System.out.println(count);
当确定只有唯一的一个结果: int count=(Integer)query.uniqueResult(); 代替
5.更新(需要加上Transaction): Transaction tr=session.beginTransaction();
hql="update User4 u set u.name='liming'";
query=session.createQuery(hql); query.executeUpdate(); tr.commit();
6.删除操作: Transaction tr2=session.beginTransaction();
hql="delete from User4 u where u.id=81";
query=session.createQuery(hql); query.executeUpdate(); tr2.commit();
7.1.?查询绑定: hql="from User4 u where u.name=?";
query=session.createQuery(hql); query.setString(0, "lm"); List user= query.list();
7.2.引用占位符:查询绑定:hql="from User4 u where u.name=:name and u.id=:id";
query=session.createQuery(hql);
query.setInteger("id", 84); query.setParameter("name", "lm");推荐使用
List user1= query.list(); assertEquals(8, user1.size());
8.分页查询功能: hql="from User4 u order by u.id"; query=session.createQuery(hql);
query.setFirstResult(2);从零计数 query.setMaxResults(10);//十分方便数据库的移植
List userlist=query.list(); for(int i=0;i
User4 name=(User4)userlist.get(i); System.out.println(name.getId()); }
9.同样支持原生SQL语句: String sql="select id ,name, age from t_user4";
Query sqlQuery=session.createSQLQuery(sql);
List result =sqlQuery.list(); for(Iterator it=result.iterator();it.hasNext();){
Object[] obj=(Object[])it.next(); Integer id=(Integer)obj[0];
String name=(String)obj[1]; Integer age=(Integer)obj[2]; }
利用得到的数据: List users=new ArrayList();
User4 user4=new User4(); user4.setId(id); users.add(user4);
讲到这里,索性将hibernate一次弄个清楚吧!!还有什么叫hibernate的模糊查询啊。
public List getUsers(String id){
List list=new ArrayList();
String hql="from User as user where user.id like :id"; //参数名称查询
factory=DBHelper.getSessionFactory();
Session session=factory.openSession();
Transaction transaction=session.beginTransaction();
Query query=session.createQuery(hql);
query.setString("id", "%"+id+"%");
list=query.list();
transaction.commit();
session.close();
return list;
}
//可以拼字符串
List students = session.createQuery("select s.id, s.name from Student s where s.name like '%1%'").list();
//Query query = session.createQuery("select s.id, s.name from Student s where s.name like ?");
//query.setParameter(0, "%1%");
//List students = query.list();
//可以使用?方式传递参数
//参数的索引从0开始
//传递的参数值,不用单引号引起来
//注意方法链编程
List students = session.createQuery("select s.id, s.name from Student s where s.name like ?")
.setParameter(0, "%1%")
.list();
//使用 :参数名称 的方式传递参数值
List students = session.createQuery("select s.id, s.name from Student s where s.name like :myname")
.setParameter("myname", "%1%")
.list();
//使用 :参数名称 的方式传递参数值
List students = session.createQuery("select s.id, s.name from Student s where s.name like :myname and s.id=:myid")
.setParameter("myname", "%1%")
.setParameter("myid", 12)
.list();
//支持in,需要使用setParameterList进行参数传递
List students = session.createQuery("select s.id, s.name from Student s where s.id in(:myids)")
.setParameterList("myids", new Object[]{1, 2, 3, 4, 5})
.list();
//查询2008年2月创建的学生
List students = session.createQuery("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?")
.setParameter(0, "2008-02")
.list();
//查询2008-01-10到2008-02-15创建的学生
List students = session.createQuery("select s.id, s.name from Student s where s.createTime between ? and ?")
.setParameter(0, sdf.parse("2008-01-10 00:00:00"))