2017-08-01 81 views
0

我有這樣的代碼CriteriaBuilder選擇多對多

@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()]); 
} 

以及如何正確在列表公司信息(@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(); 
+0

多值場難言 「喜歡」 什麼都可以嗎?你可能有什麼東西是多值字段的「成員」。 –

+0

我添加了一些信息 – LeshaRB

+0

,你的標準代碼在哪裏做JOIN?因爲一旦你有了,你可以輕鬆地添加其餘的。 http://www.datanucleus.org/products/accessplatform_5_1/jpa/query.html#_criteria_api_from_clause_joins –

回答

1

試試這個,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%"));