JPA&标准API - 只选择特定的列 [英] JPA & Criteria API - Select only specific columns
问题描述
我想只选择特定的列(例如 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 $ c的类型的
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&标准API - 只选择特定的列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!