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

标签 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"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/

相关文章:

java - 如果尝试添加记录,Hibernate 如何判断记录是否已存在?

hibernate - 在应用程序中同时使用 hibernate 和 ibatis 好不好?

java - 我需要将一个 int 变量转换为 double

java - 最终变量赋值错误

java - 循环验证和输出问题

spring - 如何使 DataJpaTest 刷新自动保存?

java - id key 的自定义包装

java - servlet 可以打开套接字与 native 代码对话吗?

java - WeakReference#get() 什么时候开始返回 null?

java - Spring boot JPA - 不带 OneToMany 关系的嵌套对象的 JSON