JPA Criteria Builder APIを使用して次のクエリを作成する方法を誰かに提案してもらえますか?
SELECT id,status,created_at from transactions where status='1'
and currency='USD' and appId='123' order by id
メタモデルクラスまたはその他の方法を使用して、Map<String,String>
として指定されたパラメーターに基づいて動的に作成するソリューションを見つけることができればより良いです。
これは次のようなものです(メタモデルなし):
Map<String, Object> params = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createTupleQuery();
Root<Transaction> r = cq.from(Transaction.class);
Predicate p= cb.conjunction();
for (Map.Entry<String, Object> param: params.entrySet())
p = cb.and(p, cb.equal(r.get(param.getKey()), param.getValue()));
cq.multiselect(r.get("id"), r.get("status"), r.get("created_at"))
.where(p)
.orderBy(cb.asc(r.get("id")));
List<Tuple> result = em.createQuery(cq).getResultList();
またはメタモデルを使用する場合(タイプセーフですが、少し言葉が多くなります):
Map<SingularAttribute<Transaction, ?>, Object> params = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createTupleQuery();
Root<Transaction> r = cq.from(Transaction.class);
Predicate p= cb.conjunction();
for (Map.Entry<SingularAttribute<Transaction, ?>, Object> param: params.entrySet())
p = cb.and(p, cb.equal(r.get(param.getKey()), param.getValue()));
cq.multiselect(r.get(Transaction_.id), r.get(Transaction_.status),
r.get(Transaction_.created_at))
.where(p)
.orderBy(cb.asc(r.get(Transaction_.id)));
List<Tuple> result = em.createQuery(cq).getResultList();