2017-02-14 65 views
0

休眠謂詞搜索我有兩個實體:在連接表

@Entity 
public class Organization { 
    @Column(name = "name") 
    public String name; 

    @OneToMany(mappedBy = "organization") 
    public Collection<Tin> tin; 
} 

@Entity 
public class Tin { 
    @Column(name = "name") 
    public String name; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "ORGANIZATION_ID", nullable = false) 
    public Organization organization; 
} 

我想錫名稱中使用CriteriaBuilder搜索組織和謂詞

對於搜索我想有謂詞的列表

List<Predicate> getPredicates() { 
    List<Predicate> predicates = new ArrayList<Predicate>(); 
    .... 
    if (StringUtils.isNotBlank(orgSearchCriteria.getTaxIdNumber())) { 
       CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 

       CriteriaQuery<Tin> criteria = criteriaBuilder.createQuery(Tin.class); 
       Root<Tin> companyRoot = criteria.from(Tin.class); 
       predicates.add(
         criteriaBuilder.equal(companyRoot.join("tin").get("name"), orgSearchCriteria.getName()) 
       ); 
      } 
    .... 
    return predicates 

} 
+0

你有沒有試過做到這一點? – Vaibs

+0

是的,我試過這個: CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery criteria = criteriaBuilder.createQuery(Tin.class); 根 companyRoot = criteria.from(Tin.class); predicates.add( )criteriaBuilder.equal(companyRoot.join(「tin」)。get(「tin」),orgSearchCriteria.getTaxIdNumber()) ); –

+0

請分享您的代碼,所以我們略知一二 – Vaibs

回答

0

這應該適合您的情況

root = criteriaQuery.from(Organization.class); 
Join<Organization, Set<Tin>> resource = root.join("tin"); 
criteriaQuery = criteriaQuery.select(root); 
Predicate predicate = criteriaBuilder.equal(resource.get(NAME_COLUMN), "name"); 
criteriaQuery.where(predicate); 
entityManager.createQuery(criteriaQuery); 
+0

感謝 這解決了我的問題 但這個 builder.createQuery(Organization.class).distinct(真); –