前言:
最近在用HQL,无奈不会,所以总结一些这个东东,希望也能给大家带来帮助
是什么:
HQL提供更加丰富灵活、更为强大的查询能力;接近SQL语句查询语法;
[select/delete/update…][from…][where…][group by…][having…][order by…]……asc/desc
基础知识:
除Java类和属性的名称外,其对大小写不敏感,
别名开头小写——不错的习惯
上盘干货:
from Customer c inner join c orders o group by c age;(1) select c ID,c name,c age,o ID,o order_number,o customer_ID from Customer c inner join c orders c group by c age;(2)
语句(1)会返回持久化对象,置于Hibernate的Session缓存中,缓存负责它们唯一及与后台数据库数据的同步,只有事务提交后它们才会清除;
而语句(2)返回的是关系数据,不用缓存,在检索之后应用程序不访问它们,其所占用的内存有可能被JVM的垃圾回收器回收,且Hibernate不会同步它们的修改;
如果某一个数据库操作:1、数据量大,2、一般情况下不会对数据修改,不需要Hibernate的Session缓存的管理,采用第一种查询方式,会导致大量持久化对象位于Hibernate的Session缓存中,而且Hibernate的Session缓存还要负责它们与数据库数据的同步。而采用第二种查询方式,显然就会提高查询性能;
参数绑定:
名称:在HQL语句中定义命名参数要用”:”开头
Query query=session createQuery(“from User user where user name = :customername and user age=:customerage ”); query setString(“customername”,name); query setInteger(“customerage”,age);
位置:
Query query=session createQuery(“from User user where user name=? and user age =? ”); query setString(0,name); query setInteger(1,age);
setParameter()方法String hql=”from User user where user name=:customername ”; Query query=session createQuery(hql); query setParameter(“customername”,name,Hibernate STRING);//命名参数名称,命名参数实际值,以及命名参数映射类型
setParameter当映射类型单一时,两个参数也是可以接受的,但是像Java util Date类型,映射类型:DATE or TIMESTAMP,所以是不能接受滴
setProperties()方法http://write.blog.csdn.net/postedit/72673682
Customer customer=new Customer(); customer setName(“pansl”); customer setAge(80); Query query=session createQuery(“from Customer c where c name=:name and c age=:age ”); query setProperties(customer);
好处:http://write.blog.csdn.net/postedit/72673682
利用预编译SQL语句缓存提升查询效率;防止SQL Injection安全漏洞的产生,类似sql注入
后语:
不知道是谁说了一句这样的话:㊣真正的高手并不是精通一切,而是精通在合适的场合使用合适的手段(这话说的太令人感动了,努力着
)
感谢大家(大方之家)的分享: