4

我想根据关联相关的对象的值在我的数据源中搜索所有对象实例。数据模型可以简化为: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 文档失败了,并在此问题中进行了描述。

我认为以一种有效的方式展示我正在努力实现的目标可能会有所帮助,然后寻求等价物——这就是我重新提出这个问题的原因。

简而言之,我的问题是:您如何将上述条件查询实现为 Hibernate 中的示例查询?我正在使用休眠 3.6.6。

谢谢!

4

1 回答 1

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 已经完全初始化。

于 2011-11-23T16:52:42.213 回答