关于Hibernate中占位符式的查询

占位符式的查询(就是采用?替换查询语句中的变量)是在采用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的那种关系型的通过外键进行查询的方式。

相关推荐