2010-08-12 48 views
3

我有一个模型,有几个属性。属性可以是原始(String)或复杂(Object)。用户可以对每个基本属性进行查询。我想知道是否有一种简单的方法来动态构建查询。我使用Java和Hibernate。动态查询多个属性与休眠

模型

public class Model { 
    String prop1; 
    Point prop2; 
    List<Shape> prop3; 
} 

PointShape是可以包含基元或对象的对象。查询的一个例子是所有实例,其中prop1 =“A”,坐标是x = 3和y = 8,其中一个形状是圆形。 prop1 =“A”,prop2.x = 3,prop2.y和prop3.get(i).type =“Circle”;我们将不得不遍历所有的prop3实例。

我的第一个想法是不可维护和低效的。它包括对所有基本属性进行查询,然后合并结果。

  • 获取所有实例,其中为prop1 = “A”
  • 获取所有实例,其中prop2.x = 3 和prop3 = Y;
  • 获取所有的实例,其中的一个 Shape.type =“Circle”;
  • 获取的所有3台

的交集是否有可能在一个更好(更聪明)的方式解决这个问题的任何现有的库或算法?

感谢

+0

你想查询一个Shape的“Java类型”还是你有一个字段类型? – 2010-08-12 14:59:49

+0

我的例子与我的真实模型相比非常简单,但是标准查询就是我正在寻找的。 – Sydney 2010-08-13 18:39:19

回答

2

你有没有看着Criteria queries?这是一个用于以编程方式构建查询和参数的Hibernate功能。

如果你的目的是查询符合所有这些条件的实体:

为prop1 = “A” 和prop2.x = 3和prop2.y和prop3.get(I).TYPE = “圆”

association queries支持,那么你可以做的条件查询类似

Criteria criteria = session.createCriteria(Model.class); 
criteria.add(Restrictions.eq("prop1", "A")); 
criteria.createCriteria("prop2") 
    .add(Restrictions.eq("x", 3)); 
    .add(Restrictions.eq("y", 2)); 
criteria.createCriteria("prop3").add(Restrictions.in("type", "Circle")); 

List results = criteria.list(); 

真正的实力正在建造的代码查询,而TH一个HQL字符串 - 允许你动态添加/设置属性等。

+0

当然,您可以在HQL中使用相同的查询语句(使用INs,JOINs等)。 – 2010-08-12 00:59:24