带有动态OR限制的Hibernate标准查询条件

3

我希望能够根据数组中元素的数量动态地向 Hibernate Criteria 添加 OR 条件限制。

在下面的示例中,Project 是一个实体,是 User 实体的一个 @OneToMany 属性。 Project 实体有一个名为 name 的属性。 db.getSes() 提供了当前的 Session

我的目前方法是:

String[] project_name_filters = {"Project Name 1","Project Name 2"};

Criteria q = db.getSes().createCriteria(User.class);

if(project_name_filters.length > 0) {
    q.createAlias("project", "project");

    LogicalExpression or_exp = null;

    for(int ix_prj = 0 ; ix_prj < project_name_filters.length ; ix_prj++) {
            or_exp = Restrictions.or (or_exp,Restrictions.eq("project.name", project_name_filters[ix_prj]));
        }   

    q.add(or_exp);
}

@SuppressWarnings("unchecked")
List<User> users = (List<User>) q.list(); 

但是or_exp = null的初始化不太合适。

我甚至不确定这是否是在Hibernate查询中实现动态OR限制集合的方式。

我该怎么做呢?


从一个有效但不可能的条件开始。 - fzzfzzfzz
所以结构没问题,我只需要将 or_exp 初始化为 false。但是怎样才能正确地实现呢?你能给我一个有效但不可能的条件的例子吗? - Jose Ospina
这就是为什么我进行了评论而不是回答——我只用原始的SQL字符串做过这个 :)在原始的SQL中,你可以从类似于1 != 1的东西开始,并添加OR语句。我不太了解Hibernate标准以给出等效的内容。 - fzzfzzfzz
1个回答

2

首先从一个肯定为假的条件开始。

您可以使用Restrictions.sqlRestriction来使用原始的SQL构建这样的条件:

Criterion impossibleCriterion = Restrictions.sqlRestriction("(1=0)");
LogicalExpression or_exp = Restrictions.or(impossibleCriterion, impossibleCriterion);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接