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

Java JPA in子句使用规范-JHipster方法,java,hibernate,jpa,spring-data-jpa,jhipster,Java,Hibernate,Jpa,Spring Data Jpa,Jhipster,我有两个实体A,B。A包含一个集合,我需要在QueryService中通过字段X或B进行过滤 我看到谓词,但我不知道如何使用它 StringFilter lf = new StringFilter(); lf.setEquals(value); return (root, query, builder) -> { Predicate p = builder.in(expression); return buil

我有两个实体A,B。A包含一个集合,我需要在QueryService中通过字段X或B进行过滤

我看到谓词,但我不知道如何使用它

        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')

谢谢

您应该这样使用
子查询
内部谓词

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);
}

它生成一个稍有不同的查询,但结果将与预期的一样

您应该以这种方式在谓词内部使用
子查询

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);
}
它会生成一个稍有不同的查询,但结果将与预期的一样

谢谢。它工作!!!(Jhipster使用SingularAttribute而不是che fieldname)谢谢。它工作!!!(Jhipster使用SingularAttribute而不是che fieldname)