java - EJBQL - 查找具有超过 'x' 关系的所有行

标签 java hibernate jpql ejbql

我知道一定有一种简单的方法可以做到这一点,但目前我还没有想到。我有一个简单的实体,例如(为简洁起见,删除了不相关的部分):

@Entity
@Table(name = "reviews")
public class Review {
    private String text;
    private boolean approved;
    private Collection<ReviewFlag> flags;

    public Review() {
        this.text = null;
        this.approved = false;
        this.flags = Collections.emptyList();
    }

    @Column(nullable = false)
    public String getText() {
        return text;
    }

    @Column(nullable = false)
    public boolean isApproved() {
        return approved;
    }

    @OneToMany(mappedBy="review")
    public Collection<ReviewFlag> getFlags() {
        return flags;
    }
}

我想运行一个查询来查找带有两个或更多标志的每个未批准的评论。像这样的东西:

SELECT r FROM Review r WHERE r.approved = 0 AND COUNT(r.flags) > 1

...但是这个语法当然不起作用(hibernate 提示语法)。我已经尝试过:

SELECT r FROM Review r WHERE r.approved = 0 HAVING COUNT(r.flags) > 1

...该程序运行,但也返回具有 0 或 1 标志的评论。我需要使用什么魔法调用来仅查找具有 2 个或更多标志的那些?

最佳答案

由于注释,我假设您在可以使用 JPQL 而不是 EJB QL 的环境中操作。如果是这样,那么SIZE运算符(operator)就是为了这种目的而存在的。它将集合的路径作为参数并返回元素的数量。

在您的情况下,JPQL 查询是:

SELECT r FROM Review r WHERE r.approved = 0 AND SIZE(r.flags) > 1

关于java - EJBQL - 查找具有超过 'x' 关系的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10629937/

相关文章:

java - 使用来自 AD 服务器的身份验证时出错

java - 使用 hibernate 选择 SQL 表中 3each 驱动程序的最后一个位置

java - 使用延迟加载的最佳方法

java - 如何通过与下一个其他对象相关的 spring 数据(jpql)获取对象

java - Google App Engine - 删除 JPQL 查询和级联

Java Netbeans : Splitting a string using regular expressions

java - Android Java 定时器()

java - Hibernate 计算属性和 SQL 查询

java - 将实体预填充到数据库中以进行测试

java - 在 Swing 应用程序中使用方法