简体   繁体   English

如何使用 jpa 标准 api 编写此查询?

[英]how to write this query using jpa criteria api?

Select c.id, (Select c2.value from customer_table c2 Where c2.id = c.id And c2.key = 'test') as "test", (Select c2.value from customer_table c2 Where c2.id = c.id And c2.key = 'service-category') as "service-category", (Select c2.value from customer_table c2 Where c2.id = c.id And c2.key = 'exam') as "exam" From customer_table c Group By c.id;

Assuming the existence and correct modeling of the customerTable entity, its relationships and that value is of type String, the implementation would be like this:假设 customerTable 实体存在并正确建模,其关系和该值是 String 类型,实现将如下所示:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<YourPojo> cq = cb.createQuery(YourPojo.class);

Root<CustomerTable> root = cq.from(CustomerTable.class);

//Subquery 1
Subquery<String> sqVal1 = cq.subquery(String.class);
Root<CustomerTable> sq1Root = sqVal1.from(CustomerTable.class);
sqVal1.where(
    cb.and(
        cb.equal(root.get("id"),sq1Root.get("id")),
        cb.equal(sq1Root.get("key"),"test")
    )
);
sqVal1.select(sq1Root.get("value"));

//Subquery 2
Subquery<String> sqVal2 = cq.subquery(String.class);
Root<CustomerTable> sq2Root = sqVal2.from(CustomerTable.class);
sqVal2.where(
    cb.and(
        cb.equal(root.get("id"),sq2Root.get("id")),
        cb.equal(sq2Root.get("key"),"service-category")
    )
);
sqVal2.select(sq2Root.get("value"));

//Subquery 3
Subquery<String> sqVal3 = cq.subquery(String.class);
Root<CustomerTable> sq3Root = sqVal3.from(CustomerTable.class);
sqVal3.where(
    cb.and(
        cb.equal(root.get("id"),sq3Root.get("id")),
        cb.equal(sq3Root.get("key"),"exam")
    )
);
sqVal3.select(sq3Root.get("value"));

cq.groupBy(root.get("id"));

cq.multiselect(
    root.get("id"),
    sqVal1.getSelection(),
    sqVal2.getSelection(),
    sqVal3.getSelection()
);

You need a pojo with a constructor with the same parameters (in order and type) as the multiselect clause您需要一个带有与 multiselect 子句具有相同参数(按顺序和类型)的构造函数的 pojo

public class YourPojo {
    public YourPojo(String id, String val1, String val2, String val3){
       [...]
    }
}

It is recommended to use metamodels to access the properties of the entities, which would lead to replace the following code建议使用元模型来访问实体的属性,这会导致替换以下代码

root.get("id");

with this other与这个其他

root.get(CustomerTable_.id);

One of the many advantages of using metamodels without getting too into the subject is the ability to auto-complete the property name and reduce the chance of error at this point.在不深入主题的情况下使用元模型的众多优势之一是能够自动完成属性名称并减少此时出错的机会。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM