【问题标题】:Dynamic Query on multiple properties with Hibernate使用 Hibernate 对多个属性进行动态查询
【发布时间】:2026-02-17 09:10:01
【问题描述】:

我有一个具有多个属性的模型。属性可以是原始的(字符串)或复杂的(对象)。用户可以对每个原始属性进行查询。我想知道是否有一种简单的方法来动态构建查询。我使用 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 个集合的交集

是否有任何现有的库或算法可以以更好(更智能)的方式解决此问题?

谢谢

【问题讨论】:

  • 您想查询Shape的“Java类型”还是有该类型的字段?
  • 与我的真实模型相比,我的示例非常简单,但条件查询正是我想要的。

标签: java hibernate


【解决方案1】:

你看过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 字符串中构建查询 - 允许您动态添加/设置属性等。

【讨论】:

  • 当然,您可以编写与我在 HQL 中相同的查询(使用 IN、JOIN 等)。