占位符式的查询 ( 就是采用 ? 替换查询语句中的变量 ) 是在采用 sql 的情况下经常使用的一种查询方式,也是查询时推荐使用的一种方式。
Hibernate 中的查询参数主要有两种类型:值类型和实体类型,值类型就是指一个切实的值 ( 如 String 、 int 、 List 这些 ) ,实体类型就是一个具体的实体,如编写的 User 、 Organization 等,值类型的查询和普通 sql 几乎一样,而实体类型的查询就体现了 Hibernate 的强项, ^_^ ,可以起到简化 sql 的作用,并且使得查询语句更加容易理解。
1.简单值
举例如下:
from User where u.name=:username and u.yearold=:yearold
这就是一个常见的简单值的占位符式的查询,通过这样的方式就可以把值注入到参数中:
query.setParameter(“username”,”bluedavy”);
query.setParameter(“yearold”,22);
同样, hibernate 也支持和 sql 完全相同的 ? 的方式,那么上面的语句以及注入参数的方式就变为了:
from User where u.name=? and u.yearold=?
query.setParameter(0,”bluedavy”);
query.setParameter(1,22);
推荐使用第一种,那样参数的意义更容易被理解。
2.in 查询
in 查询也是经常被使用到的一种查询,在 Hibernate 中表现出来会稍有不同,不过如果按照对象观点去看就很容易理解了,例如下面这句:
from User where u.name in (:usernameList) ;
在 Hibernate 中通过这样的方式将值注入到这个参数中:
List list=new ArrayList();
list.add(“jerry”);
list.add(“bluedavy”);
query.setParameterList(“usernameList”,list);
在 sql 中通常是组装一个由 , 连接的值来构成 in 中的参数值,而在 Hibernate 中则依照对象转化为采用 list 了, ^_^ ,是不是更方便些。
3. 实体类型
在Hibernate中关联采用的都是对象形式,表现对外就是隐藏了数据库的外键的部分,这也就对习惯使用sql查询的人带来一个问题,因为无法再操作外键字段,那么在涉及到关联的实体的查询时应该怎么做呢,我把它分为单实体和实体集合两种情况来说说。
4.单实体
单实体的查询对应到 sql 情况通常是在一对多的情况下通过多端查询同时结合一端的一些过滤条件,在 sql 中通常采用 join 的方式来实现这个,而在 Hibernate 中要实现这点就更容易了,举例如下:
User 和 Organization 是一对多,现在要查询属于组织机构名称为 ”Blogjava”
以及用户年龄大于 20 的用户:
from User where u.org.name=:orgname and u.yearold>:yearold
query.setParameter(“orgname”,”lut.cn”);
query.setParameter(“yearold”,20);
可以看到这样的查询语句比 sql 更简单多了,同时也更容易理解多了。
5.实体集合
实体集合过滤形式的查询在实际的项目中也经常会碰到,仍然用上面的例子,但改为通过 Organization 去查询:
from Organization org where org.name=:orgname and org.users.yearold>:yearold
是不是比 sql 简单多了,而且更容易理解呢, ^_^
这个时候对象化查询语句的优势就体现出来了,而不用陷入 sql 的那种关系型的通过外键进行查询的方式。