繁体   English   中英

JPA 规范与@ManyToMany 属性

[英]JPA Specification with @ManyToMany property

我有 2 个与 @ManyToMany 关系相关的实体:

public class EntityA {

@Id
private Long id;
.
.
.
@ManyToMany(fetch = fetchType.EAGER)
private List<EntityB> listOfB;

}

我想创建 JPA 规范,它将通过 EntityB 的 id 查询 IN 子句。 我努力了

  private static Specification<EntityA> listOfB(String path, List<Long> idsOfB) {
        return (root, query, cb) -> {
            //path is passed as "listOfB"
            return root.get(path).in(idsOfB);
        };
    }

但我得到org.postgresql.util.PSQLException: ERROR: syntax error at or near "."

您没有显示失败的 SQL,所以我只能猜测出了什么问题。 一个可能的问题是 id 列表为空。

由于您正在编写您正在传递listOfB ,因此真正的问题是您正在将实体与长列表进行比较,这是行不通的。

您要么需要使用引用对象,即代理,要么使用idsOfB.stream().map(id -> em.getReference(EntityB.class, id)).collect(toList())或加入listOfB

我认为您真正想要的是使用 EXISTS 谓词。 像这样的东西:

private static Specification<EntityA> listOfB(String path, List<Long> idsOfB) {
    return (root, query, cb) -> {
        Subquery<Integer> subquery = query.subquery(Long.class);
        Root<EntityA> root = subquery.correlate(root);
        subquery.where(root.join(path).get("id").in(idsOfB));
        subquery.select(cb.literal(1L));
        return cb.exists(subquery);
    };
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM