Hibernate:Query By Example等效于关联Criteria Query

时间:2011-11-23 02:21:22

标签: java hibernate hibernate-criteria query-by-example

我想根据关联相关对象的值搜索我的数据源中的所有对象实例。数据模型可以简化为:类型A的对象包含类型B的对象列表。目标是查找A的所有实例,其中A包含B,使得B的属性值为X.

我已经可以使用Criteria查询成功实现此目的,如下所示:

  List<A> results = session.createCriteria(A.class)
    .createCriteria("listOfBs")
    .add(Restrictions.eq("propertyInB", x))
    .list();

这是一种简化,B的多个属性将适用 - 搜索功能对于用户填充的过滤器是必需的。

我想用逐个查询替换这种方法 - 我只需创建一个带有所需参数的对象图。我尝试遵循Hibernate文档失败了,并在this question中进行了描述。

我认为以可行的方式展示我想要实现的目标,然后寻找等价物可能会有所帮助 - 这就是我重新提出这个问题的原因。< / p>

简而言之,我的问题是:如何在Hibernate中将示例查询作为示例查询实现?我正在使用Hibernate 3.6.6。

谢谢!

1 个答案:

答案 0 :(得分:6)

假设您想要执行以下操作:

Select a.* , b* 
from a join b on a.id = b.id 
where a.property1 = "wwww"
and a.property2="xxxx"
and b.property1="yyyy"
and b.property2="zzzz"

使用Query by Example(QBE)实现上述查询:

/***Initialize an instance of Class A with the properties that you want to match***/
A instanceA = new A();
instanceA.setProperty1("wwww");
instanceA.setProperty2("xxxx"); 
Example exampleA = Example.create(instanceA);

/***Do the same for the Class B**/
B instanceB = new B();
instanceB.setProperty1("yyyy");
instanceB.setProperty2("zzzz"); 
Example exampleB = Example.create(instanceB);

/**Create and execute the QBE***/
List<A> results = session.createCriteria(A.class)
    .add(exampleA)
    .createCriteria("b",CriteriaSpecification.LEFT_JOIN) // b is the property of Class A
    .add(exampleB)
    .list();

结果已经是fetch-joined,这意味着A中的集合实例B已经完全初始化。