Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JPA标准生成器的复杂查询_Java_Jpa_Criteria_Builder - Fatal编程技术网

Java 使用JPA标准生成器的复杂查询

Java 使用JPA标准生成器的复杂查询,java,jpa,criteria,builder,Java,Jpa,Criteria,Builder,有人能建议我如何使用JPA Criteria builder API构建以下查询吗 SELECT id,status,created_at from transactions where status='1' and currency='USD' and appId='123' order by id 如果我能找到一个解决方案,使用元模型类或任何其他方式,根据作为映射提供的参数动态创建,那就更好了。它是这样的(没有元模型): Map参数=。。。; CriteriaBuilder cb=

有人能建议我如何使用JPA Criteria builder API构建以下查询吗

SELECT id,status,created_at from transactions where status='1' 
   and currency='USD' and appId='123' order by id
如果我能找到一个解决方案,使用元模型类或任何其他方式,根据作为
映射提供的参数动态创建,那就更好了。

它是这样的(没有元模型):

Map参数=。。。;
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createTupleQuery();
根r=cq.from(Transaction.class);
谓词p=cb.conjunction();
对于(Map.Entry参数: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”))
.其中(p)
.orderBy(cb.asc(r.get(“id”)));
List result=em.createQuery(cq.getResultList();
或者使用元模型(类型安全,但有点冗长):

Map参数=。。。;
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createTupleQuery();
根r=cq.from(Transaction.class);
谓词p=cb.conjunction();
对于(Map.Entry参数:params.entrySet())
p=cb.and(p,cb.equal(r.get(param.getKey()),param.getValue());
cq.multiselect(r.get(事务id)、r.get(事务状态),
r、 获取(事务(创建时))
.其中(p)
.orderBy(cb.asc(r.get(Transaction.id));
List result=em.createQuery(cq.getResultList();
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();