JPA&标准API - 只选择特定的列 [英] JPA & Criteria API - Select only specific columns

查看:478
本文介绍了JPA&标准API - 只选择特定的列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想只选择特定的列(例如 SELECT a FROM b )。我有一个通用的DAO,我想出的是:

  public List< T> getAll(boolean idAndVersionOnly){
CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery< T> criteria = builder.createQuery(entityClazz);
Root< T> root = criteria.from(entityClazz);
if(idAndVersionOnly){
criteria.select(root.get(ID)。get(VERSION)); //这里是错误
} else {
criteria.select(root);
}
return manager.createQuery(criteria).getResultList();
}

错误是:
方法select(CriterionQuery< T>类型的选择<?扩展T>)不适用于参数(路径< Object>)。我应该如何改变它?我想得到一个只有 ID VERSION T $ c>字段,所有其他字段都是 null



类型 T 扩展 AbstractEntity ,它包含这两个字段。

entityClazz T.class

解决方案

其中之一JPA获取特定列的方法是请求一个元组对象。

在你的情况下,你需要写下这样的内容:

  CriteriaQuery中<元组GT; cq = builder.createTupleQuery(); 
//像往常一样写入Root,Path元素
Root< EntityClazz> root = cq.from(EntityClazz.class);
cq.multiselect(root.get(EntityClazz_.ID),root.get(EntityClazz_.VERSION)); //使用元模型
List< Tuple> tupleResult = em.createQuery(cq).getResultList();
for(Tuple t:tupleResult){
Long id =(Long)t.get(0);
长版=(长)t.get(1);

$ / code>

如果你有一个代表结果的类,比如<$ code> T 在你的情况下。 T 不需要是实体类。如果 T 具有如下构造函数:

  public T(Long id,长版)

然后您可以使用 T 直接在你的 CriteriaQuery 构造函数中:

  CriteriaQuery< T> cq = builder.createQuery(T.class); 
//像往常一样写入Root,Path元素
Root< EntityClazz> root = cq.from(EntityClazz.class);
cq.multiselect(root.get(EntityClazz_.ID),root.get(EntityClazz_.VERSION)); //使用元模型
List< T> result = em.createQuery(cq).getResultList();

请参阅链接以供进一步参考。

I would like to select only specific columns (ex. SELECT a FROM b). I have a generic DAO and what I came up with is:

public List<T> getAll(boolean idAndVersionOnly) {
    CriteriaBuilder builder = manager.getCriteriaBuilder();
    CriteriaQuery<T> criteria = builder.createQuery(entityClazz);
    Root<T> root = criteria.from(entityClazz);
    if (idAndVersionOnly) {
        criteria.select(root.get("ID").get("VERSION")); // HERE IS ERROR
    } else {
        criteria.select(root);
    }
    return manager.createQuery(criteria).getResultList();
}

And the error is: The method select(Selection<? extends T>) in the type CriteriaQuery<T> is not applicable for the arguments (Path<Object>). How should I change that? I want to get a type T object that has only ID and VERSION fields, and all others are null.

Type T extends AbstractEntity which has those 2 fields.

entityClazz is T.class.

解决方案

One of the JPA ways for getting only particular columns is to ask for a Tuple object.

In your case you would need to write something like this:

CriteriaQuery<Tuple> cq = builder.createTupleQuery();
// write the Root, Path elements as usual
Root<EntityClazz> root = cq.from(EntityClazz.class);
cq.multiselect(root.get(EntityClazz_.ID), root.get(EntityClazz_.VERSION));  //using metamodel
List<Tuple> tupleResult = em.createQuery(cq).getResultList();
for (Tuple t : tupleResult) {
    Long id = (Long) t.get(0);
    Long version = (Long) t.get(1);
}

Another approach is possible if you have a class representing the result, like T in your case. T doesn't need to be an Entity class. If T has a constructor like:

public T(Long id, Long version)

then you can use T directly in your CriteriaQuery constructor:

CriteriaQuery<T> cq = builder.createQuery(T.class);
// write the Root, Path elements as usual
Root<EntityClazz> root = cq.from(EntityClazz.class);
cq.multiselect(root.get(EntityClazz_.ID), root.get(EntityClazz_.VERSION));  //using metamodel
List<T> result = em.createQuery(cq).getResultList();

See this link for further reference.

这篇关于JPA&amp;标准API - 只选择特定的列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆