我想根据关联相关对象的值搜索我的数据源中的所有对象实例。数据模型可以简化为:类型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。
谢谢!
答案 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已经完全初始化。