簡體   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