当前位置: 首页 > 面试题库 >

JPA和条件API-仅选择特定的列

司空丰
2023-03-14
问题内容

我只想选择特定的列(例如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对象,该对象仅具有IDVERSION字段,而其他所有对象都是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不必是Entity类。如果T具有类似的构造函数:

public T(Long id, Long version)

那么您可以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();

请参阅此链接以获取更多参考。



 类似资料:
  • 问题内容: 我正在使用Spring JPA执行所有数据库操作。但是我不知道如何从Spring JPA的表中选择特定的列? 例如: 问题答案: 你可以从这样的类中在注释中进行设置: 请注意,你将不得不自己进行映射。像这样使用常规映射查找可能会更容易,除非你确实只需要这两个值: 也许也值得看一下Spring数据文档。

  • 我正在使用Spring JPA执行所有数据库操作。但是,我不知道如何在Spring JPA中从表中选择特定的列? 例如:

  • 问题内容: 我有一个包含ID,WorkerID,IsActive标志(1或0)和LocalTime的表。每次工作人员处于活动状态或不活动状态时,都会使用WorkerID,1或0标志记录以及一个时间(LocalTime)创建一条记录。 我想插入一个新表中:从该表中,对于每个唯一的WorkerID,仅当该记录的IsActive标志为1时,才为该唯一的WorkerID选择具有最新LocalTime的记录

  • 我想从我的表中获取一些特定的列,但我得到了这个错误:无法执行查询;SQL[按名称顺序从字符中选择名称、图像asc];嵌套的异常是org。冬眠例外SQLGrammarException:无法执行查询。 o、 引擎。jdbc。spi。SqlExceptionHelper:SQL错误:0,SQLState:42703 o.h.engine。jdbc。spi。SqlExceptionHelper:在此结果

  • 但是我在遗留系统上有一个具有许多属性的对象,我只想选择几个,尽管我知道选择几个属性通常是很快的。 如果不使用条件查询,这可能吗?

  • 我们可以通过在存储库接口中编写自定义@Query方法来选择特定列。但是,我不想为不同的属性编写这么多方法。 我试过这个,但它一直返回整个对象。 用作: 这是正确的方法吗?错在哪里?