JPA和Criteria API - 仅选择特定列

Bar*_*cki 59 java hibernate jpa criteria-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")); // HERE IS ERROR
    } else {
        criteria.select(root);
    }
    return manager.createQuery(criteria).getResultList();
}
Run Code Online (Sandbox Code Playgroud)

错误是: The method select(Selection<? extends T>) in the type CriteriaQuery<T> is not applicable for the arguments (Path<Object>).我该怎么改变?我想得到一个T只有IDVERSION字段的类型对象,而其他所有的都是null.

类型Textends AbstractEntity包含这两个字段.

entityClazzT.class.

per*_*ssf 85

获取特定列的JPA方法之一是要求一个Tuple对象.

在你的情况下,你需要写这样的东西:

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);
}
Run Code Online (Sandbox Code Playgroud)

如果您有一个表示结果的类,则可以使用另一种方法,例如T您的情况.T不需要是实体类.如果T有一个像这样的构造函数:

public T(Long id, Long version)
Run Code Online (Sandbox Code Playgroud)

那么你可以T直接在你的CriteriaQuery构造函数中使用:

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();
Run Code Online (Sandbox Code Playgroud)

有关详细参考,请参阅此链接.


小智 8

cq.select(cb.construct(entityClazz.class, root.get("ID"), root.get("VERSION")));  // HERE IS NO ERROR
Run Code Online (Sandbox Code Playgroud)

https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Criteria#Constructors