私はチェックリストインスタンスオブジェクトを持っていて、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;
}
誰でも助けることができますか? –
まず、ListのSet inteadを使うのが好きです。もっと便利です。あなたの質問のために、私は、タスクのリストを定義するためにTreeSetを使用して、タスクエンティティ上のComparableインターフェイスを実装することをお勧めします。 )あなたは好きなように独自の注文を実装できます;) –
@MohamedBathaouiいいえ、私は注文照会を実装するために条件照会ビルダーを使いたいと思います。実行する方法 ? –