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"))  
            .setParameter(1, sdf.parse("2008-02-15 23:59:59"))  
            .list();

这上面是一个模糊查询,网很多说的三种

   
public static void page()   
  
    Session s = null;   
    try   
     
        s = HibernateUtil.getSeesion();   
        final String hql = " from User "; //User是类名   
        final Query q = s.createQuery(hql);   
        q.setFirstResult(0); //从第0条开始   
        q.setMaxResults(10); //取出10条   
        final List list = q.list();   
        for (final User u : list)   
         
            System.out.println(u.getId() + " " + u.getName());   
         
 
     
    finally   
     
        s.clear();   
     

HibernateUtil  工具类

package dao;       
import org.hibernate.Session;     
import org.hibernate.SessionFactory;     
import org.hibernate.cfg.Configuration;     
    
    

public class HibernateUtil     
    
    static SessionFactory   sessionFactory  = null;     
    static    
       
        final Configuration cfg = new Configuration();     
        cfg.configure(); //路径可以改变     
        sessionFactory = cfg.buildSessionFactory();     
       
    
    public static SessionFactory getSessionFactory()     
       
        return sessionFactory;     
       
    
        
    public static Session getSeesion()     
       
        return sessionFactory.openSession();     
       
 

一些常见的知识: 

Hibernate HQL 查询
介绍和基本语法
HQL 大小写不敏感,当有相同的实体类名时,使用包名.实体类
Query query=session.createQuery("from Cat c");
List catlist=query.list();
返回单个对象
Query q=session.createQuery("select count(c) from Cat c");
Number num=(Number)q.uniqueResult(); //返回单个实例
int count=num.intValue(); //返回数值
查询总数时,HQL 格式必须为以上语句格式,返回值可能为
Short Integer Long BigInteger 具体由主键的类型而定
返回 Object[]数组
Listlist=session.createQuery
("select c.name,c.mother from Cat c").list();
//获取
for(Object[] row : list){
for(Object obj : row){
System.out.println(obj);
}
}
返回 List 类型
String hql="select new List(c.name,c.mother) from Cat c"'
List list=session.cresteQuery(hql).list();
//获取
For(List row : list){
For(Object obj : row){
System.out.println(obj);
}
}
返回 Map 类型
String hql="sesect new map(c.name as name,c.mother as mother)" + "from Cat c" ;
List listMap=session.creatgQuery(hql).list();
//获取
for(Map map : (ListlistMap){
System.out.println("Name:"+map.get("name"));
System.out.println("Mother:"+map.get("mother"));
}
返回实体对象
String hql="select new Cat(cat.name,cat.createDate) from Cat c ";
List catList=session.createQuery(hql).list();
注意:
这样使用时,Cat 类中必须存在一个 public Cat(String name,Date createDate)
的构造方法。因为 Hibernate 是通过调用该构造方法完成返回值从 Object[]数组
转化到 Cat 类实体类的。
条件查询和运算符
Where 子句的语法
String hql="select c from Cat c"+" where c.mother.name=null
and c.createDate<:createDate";
session.createQuery(hql).setParameter("createDate",new Date()).list();
表达式 setParameter()传递参数
HQL 支持的运算符
� 数学运算符:+ - * /
� 比较操作符:= != < <= > >= like
� 逻辑计算法:and or not
� SQL 操作符:in 、not in 、between 、is null 、is not null
is empty 、number of
� 字符串连接:|| 或 concat("","")
� 时间日期函数:current_date() current_time() current_timestamp()
Second() minute() hour() day() month() year()
� JPA 定义的操作:substring() coalesce() lower() upper() lenth()
Locate() abs() sqrt() bit_lenth() nullif() trim()
� 数据库支持的 SQL 标量函数:sign() trunc() rtrim() sin()
� 简单的跳转语句:case...when...then...else...end
语法:看高级查询,设置查询条件时,应尽量使用 setParameter()传递参数。
统计函数
String hql="select count(c) from Cat c where c.mother !=null";
Number num=(Number)session.createQuery(hql).uniqueResult();
int count=num.intValue(); //同返回单个对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huangleijay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值