使用Hibernate对多个属性进行动态查询

时间:2010-08-12 00:09:32

标签: java hibernate

我有一个具有多个属性的模型。属性可以是原始(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组的交集

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

由于

1 个答案:

答案 0 :(得分:2)

你看过Criteria queries了吗?它是一种用于以编程方式构造查询和参数的Hibernate功能。

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

  

prop1 =“A”和prop2.x = 3和prop2.y和prop3.get(i).type =“Circle”

支持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();

Criteria查询的真正优势在于在代码中而不是在HQL字符串中构建查询 - 允许您动态添加/设置属性等。