2017-02-14 16 views
0

私は2エンティティを持っている:休止状態述語の検索

@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(true); –