java - CriteriaBuilder 选择多对多

标签 java jpa predicate

我有这样的代码

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
public Registration getRegistration() {
    return registration;
}

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "COMPANY_USER", joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "COMPANY_ID", referencedColumnName = "ID"))

public List<CompanyInfo> getCompanyInfoList() {
    return companyInfoList;
}

对于注册中的示例(@OneToOne)我搜索如此

private Predicate[] buildPredicates(UserFilter example, CriteriaBuilder qb, Root root) {
    ArrayList<Predicate> predicates = new ArrayList<>();
    if (example != null) {
    predicates.add(qb.like(qb.upper(root.get(UserInfo_.registration).get(Registration_.messageCode)), "%TEST%"));
    }
    return predicates.toArray(new Predicate[predicates.size()]);
}

以及如何在列表 CompanyInfo (@ManyToMany) 中正确搜索

predicates.add(qb.like(qb.upper(root.get(UserInfo_.companyInfoList).... ??

例如我想要得到这样的sql

SELECT u.id, u.login_name, c.name
  FROM user_info  u
       INNER JOIN company_user cu ON cu.user_id = u.id
       INNER JOIN company_info c ON cu.company_id = c.id
 WHERE UPPER (c.name) LIKE 'ОДО%'

company_user是链接表。

使用 CriteriaBuilder

    CriteriaBuilder qb = em.getCriteriaBuilder();
    CriteriaQuery<Long> query = qb.createQuery(Long.class);
    Root<UserInfo> root = query.from(UserInfo.class);
    query.select(qb.count(root.get(UserInfo_.id)));

    Subquery<String> subquery = query.subquery(String.class);
    Root<CompanyInfo> subRoot = subquery.from(CompanyInfo.class);
    subquery.select(subRoot.get(CompanyInfo_.id));

    List<Predicate> restrictions = buildPredicates(example, qb, root);
    List<Predicate> restrictionsSub = buildPredicatesSub(example, qb, subRoot);
    Predicate[] predicates = joinList(restrictions, restrictionsSub);
    query.where(predicates);

    return em.createQuery(query.distinct(true)).getSingleResult();

最佳答案

试试这个,Entity_AEntity_BmanyToMany 关联实体:

Join<Entity_A, Entity_B> join = root.join("associationList", JoinType.INNER);
predicates.add(cb.like(join.get("name").as(String.class), "%test%"));

关于java - CriteriaBuilder 选择多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45433003/

相关文章:

Prolog:如何判断谓词是否是确定性的

java - 如何从 double 中删除科学记数法以获得最长的 double 值

java - 最小的epsilon使得比较结果改变

java - MSSql 服务器 jpa 空间异常

java - 如何将 JQPL 查询转换为 DTO?

java - 在Java8中,如何确保不使用重复转换?

java - 远程运行 Hbase ImportTSV 作业

Java 对重写的 equals 方法中的 == 感到困惑

java - JPA:我应该如何注释这个 map 集合?

list - 方案/ Racket : A function which separates a list into two lists of elements that match a certain predicate and those that don't match it