JPA in 子句使用规范 - JHipster 方法

JPA in clause using Specification - JHipster approach

我有 2 个实体 A、B。A 包含一个集合,我需要在 QueryService 中按 B 的字段 X 进行过滤。

我看到谓词,但我不明白如何使用它。

        StringFilter lf = new StringFilter(); lf.setEquals(value);
        return (root, query, builder) -> {
            Predicate p = builder.in(expression);
            return builder.and(p);
        };

“表情”里放了什么????获得类似的东西:

SELECT * FROM A WHERE 
A.id in (select b.id_A from b where b.code_field ='alfacentauri')

谢谢!

你应该这样在 predicate 中使用 Subquery

return (root, query, builder) -> {
    Subquery<Long> subquery = query.subquery(Long.class); // if b.id_A has Long type
    Root<B> subRoot = subquery.from(B.class);
        
    final Predicate codeFieldPredicate = 
        builder.equal(subRoot.get("code_field"), "alfacentauri");
        
    subquery.select(subRoot.get("id_A")).where(codeFieldPredicate);

    return builder.in(root.get("id")).value(subquery);
}

另一种方法是使用exists谓词

return (root, query, builder) -> {
    Subquery<Long> subquery = query.subquery(Long.class);
    Root<B> subRoot = subquery.from(B.class);
            
    final Predicate mainQueryPredicate = 
        builder.equal(root.get("id"), subRoot.get("id_A"));
    final Predicate codeFieldPredicate = 
        builder.equal(subRoot.get("code_field"), "alfacentauri");
            
    subquery.select(subRoot.get("id_A")).where(mainQueryPredicate , codeFieldPredicate);
    
    return builder.exists(subquery);
}

它生成的查询有点不同,但结果符合预期