我有一个具有多个属性的模型。属性可以是原始的 (String) 或复杂的 (Object)。用户可以查询每个原始属性。我想知道是否有一种简单的方法来动态构建查询。我使用 Java 和 Hibernate。
模型
public class Model {
String prop1;
Point prop2;
List<Shape> prop3;
}
Point
和 Shape
是可以包含图元或对象的对象。查询的一个示例是 prop1 = "A"且坐标为 x = 3 和 y = 8 且其中一个形状为圆形的所有实例。
prop1 = "A"and prop2.x = 3 and prop2.y and prop3.get(i).type = "Circle";我们将不得不迭代 prop3 的所有实例。
我的第一个想法无法维护且效率低下。它包括对所有原始属性进行查询,然后合并结果。
- 获取 prop1 = "A"的所有实例
- 获取 prop2.x = 3 的所有实例 prop3 = y;
- 获取其中之一的所有实例 Shape.type = "圆形";
- 获取所有 3 个集合的交集
是否有任何现有的库或算法可以更好(更智能)地解决这个问题?
谢谢
最佳答案
你看过Criteria queries了吗? ?这是一个以编程方式构建查询和参数的 Hibernate 功能。
如果您的意图是查询符合所有这些条件的实体:
prop1 = "A" and prop2.x = 3 and prop2.y and 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 字符串中构建查询 - 允许您动态添加/设置属性等。
关于java - 使用 Hibernate 对多个属性进行动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463813/