2017-09-12 6 views
0

私はチェックリストインスタンスオブジェクトを持っていて、1つのチェックリストインスタンスの中には、複数のタスクオブジェクト(1対多の関係)があります。私はすべてのチェックリストオブジェクト(タスクも含む)を取得するためにCriteriaBuilderを使用しています。私はチェックリストを特定の順序でフェッチしたいと思う(作成日、昇順を基準にして)、別の特定の順序で各チェックリスト内のタスクをフェッチしたい(それを基準にして降順)。次の例に示すように、条件式を使用してチェックリストオブジェクトをこの順序でフェッチする方法を知っています。 しかし、私はどのように必要な方法で各チェックリストのタスクをフェッチするかを知りたいですか?javaの基準ビルダーを使用して2つのフィールド(2つの別個のエンティティに属する)で注文する方法は?

return jpaApi.withTransaction(em -> { 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<ChecklistInstance> q = cb.createQuery(ChecklistInstance.class); 
    Root<ChecklistInstance> instance = q.from(ChecklistInstance.class); 
    List<Predicate> predicates = new ArrayList<>(); 
    predicates.add(cb.equal(instance.get(TaskConstants.CHECKLIST).get("id"), criteria.getChecklist())); 
    q.orderBy(cb.asc(instance.get(TaskConstants.DUE_DATE))); 
    q.select(instance).where(predicates.toArray(new Predicate[] {})); 
    return em.createQuery(q).getResultList(); 
}); 

@Entity 
@Table(name = "tm_checklist_instance") 
public class ChecklistInstance implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    private String guid; 

    private String name; 

    @OneToMany(targetEntity = Task.class, mappedBy = "checklistInstance", cascade = CascadeType.REFRESH, fetch = FetchType.EAGER) 
    private List<Task> tasks; 
} 
+0

誰でも助けることができますか? –

+0

まず、ListのSet inteadを使うのが好きです。もっと便利です。あなたの質問のために、私は、タスクのリストを定義するためにTreeSetを使用して、タスクエンティティ上のComparableインターフェイスを実装することをお勧めします。 )あなたは好きなように独自の注文を実装できます;) –

+0

@MohamedBathaouiいいえ、私は注文照会を実装するために条件照会ビルダーを使いたいと思います。実行する方法 ? –

答えて

0

タスクリスト上の@OrderByアノテーションを追加します。

@OneToMany(targetEntity = Task.class, mappedBy = "checklistInstance", cascade = CascadeType.REFRESH, fetch = FetchType.EAGER) 
@OrderBy("due_date DESC") 
private List<Task> tasks; 

独自のフィールドで "DUE_DATE" を交換してください。

希望このヘルプ;)

+0

実際には、フィールド順は固定フィールドではありません。それはいくつかの条件によって異なります。例えば私はすべてのOPENチェックリストのインスタンスを取得したい場合、私は(インスタンスに関連付けられている)タスクを期日順にソートしたいのですが、完了したチェックリストインスタンスをフェッチしたい場合は、どのようにして、エンティティクラスで条件付き注文を行うことができますか? –

+0

アイデアみんな? –

+0

良い対処法は、TreeSetを使って作業し、Comparableインターフェイス(Comparableインターフェイスではなく)を使用して、タスクの条件付き並べ替えに応答することです。個人的に私はCriteriaBuilderの解決策を持っていません。 –

関連する問題