java - JPA & Criteria API - 仅选择特定列

标签 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();
}

错误是: The method select(Selection<? extends T>) in the type CriteriaQuery<T> is not applicable for the arguments (Path<Object>) .我应该如何改变它?我想得到一个类型T只有 ID 的对象和 VERSION字段,所有其他字段为 null .

输入 T延长 AbstractEntity其中有这两个字段。

entityClazzT.class .

最佳答案

仅获取特定列的 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);
}

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

public T(Long id, Long version)

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

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();

查看 link供进一步引用。

关于java - JPA & Criteria API - 仅选择特定列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12618489/

相关文章:

java - Jmeter测试使用maven运行

java - JTextArea.append 的线程安全

java - DEFAULT_SIZE 和 PREFERRED_SIZE 有什么区别?

java - 如何从存储库返回多个扩展类的类?

java - 更改参数数量后的 hibernate ConstraintViolationException

java - 持久化一个对象的成员,即一个实体 "has"而不是对象本身

java - 导入项目到eclipse

java - hibernate无法检测命名参数

java - JPA 关系可能性

java - hibernate JPA : mappedBy reference exception