hibernate的模糊查询和sql查询

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"))  
        

你可能感兴趣的:(SSH)