2017-10-11 10 views
0

私はTeacherクラスにコースのリストを含んでいますが、今はハイバーネイトcriteriaと制限を使用してこのコースのリストをフィルタリングする方法がわかりません。あなたは、あなたのコレクションのaliasを作成する必要がハイバーネーションの制限ManyToMany

EntityManager em = getEntityManager(); 
    CriteriaBuilder builder = em.getCriteriaBuilder(); 
    List<Teacher> result = Collections.EMPTY_LIST; 

    CriteriaQuery<Teacher> criteria = builder.createQuery(Teacher.class); 
    Root<Teacher> from = criteria.from(Teacher.class); 

    if (searchCriteria != null) { 
     List<Predicate> restrictions = new ArrayList<Predicate>(); 

     if (searchCriteria.getCourse() != null) { 
      //Here I don't know how to make the restrictions on Set of 
      //courses 
      restrictions.add(builder.equal(from.get("courses"), 
      searchCriteria.getCourse())); 
     } 
     addRestrictionsToCriteria(restrictions, criteria, builder); 
    } 
+0

コースのエイリアスを作成し、そのエイリアスを[制限]で参照します。私は少しだけ完全な回答を投稿しようとします –

答えて

0

public class Teacher extends BaseEntity implements Serializable { 
    @ManyToMany(targetEntity = Course.class, fetch = FetchType.EAGER) 
    private Set<Course> courses; 
} 

public class TeacherSearchCriteria extends Criteria { 
    private Course course; 
} 

は、ここで制限ロジックを提供し、私のサービスクラスです。次に、コレクション内のプロパティに対して制限を追加できます。エイリアスの作成は、SQLを構築するときにテーブルへの結合を実行するようにhibernateに指示します。

EntityManager em = getEntityManager(); 
CriteriaBuilder builder = em.getCriteriaBuilder(); 
List<Teacher> result = Collections.EMPTY_LIST; 

CriteriaQuery<Teacher> criteria = builder.createQuery(Teacher.class); 
criteria.createAlias("courses", "c") 
     .add(Restrictions.eq("c", searchCriteria.getCourse());