2009-12-03 136 views
1

我正在创建一个可以创建动态查询的Hibernate查询引擎。到目前为止,我一直在使用Criterion API来生成查询。我很难以OO的方式编写引擎。我希望能够为每个关联创建一个新类,并让它返回一个SQL调用的片段。休眠OO设计问题

例如:

一个人可能拥有一个家,汽车和船。

我希望用户能够搜索“回归,有一个蓝色的家和红船的任何人” 我有一个SEARCHTERM地图,看起来像:

home.color =蓝色

boat.color = red

我想为每个标准(船,汽车,家)提供一个单身人士,我可以传入整个地图并返回给我一个Criteria对象,我可以用它来建立我的查询。这就是理论。我遇到的问题是,在Hibernate中,我需要创建一个标准或别名来建立人与船/房子/汽车之间的关联。为了做到这一点,我必须通过休眠会话。我真正想要的是能够返回分离标准并将它们合并在一起。但似乎没有办法做到这一点。

总结: 一个返回一个标准对象的类,该标准对象使得没有会话对象的关联。

有什么想法?

感谢您的阅读!

回答

3

DetachedCriteria不适合你吗?

更新(基于评论)

我怎么有不同的对象来创建 不同的独立式标准和在一个查询合并 他们在一起?

你不“合并”它们。在您的示例中,Person是根实体(因为您正在搜索用户;并且它与所有其他实体(如House,Boat,Car)有关联)。因此,你会开始创建标准Person

DetachedCriteria personCriteria = DetachedCriteria.forClass(Person.class); 

,然后根据你的条件,创建一个协会在需要的时候:

// this assumes that "Boat" is mapped as many-to-one "boat" property on "Person" 
DetachedCriteria boatCriteria = personCriteria.createCriteria("boat"); 
boatCriteria.add(Restriction.eq("color", "red")); 

// same for house 
DetachedCriteria houseCriteria = personCriteria.createCriteria("house"); 
houseCriteria.add(Restriction.eq("color", "blue")); 

// when you're all done you search based on "personCriteria" 
personCriteria.getExecutableCriteria(session).list(); 

在一个侧面说明,你可能想看看Hibernate Generic DAO这个项目,特别是它的Search这个组件基本上是Criteria API做的正确:-)

+0

+1提到有趣的g oogle项目。 – BalusC 2009-12-04 00:05:15

+0

但是,我如何让不同的对象创建不同的Detached Criteria并将它们合并到一个查询中? – davidemm 2009-12-04 14:50:17