【问题标题】:JPA @Query issues with the returned objectJPA @Query 与返回的对象有关
【发布时间】:2017-10-06 12:32:19
【问题描述】:

我已经在我的 DAO 中添加了这个:

@Query("SELECT distinct LBL.cId, LBL from FooBar LBL ORDER BY LBL.collectedAt DESC")
    List<FooBar> findDistinctcIdOrderByCollectedAtDesc();

然后这是我的服务

List<FooBar> fooBars = this.liveBusLocationDao.findDistinctcIdOrderByCollectedAtDesc();

这就是我调试 fooBars 内容时得到的结果

fooBars = {ArrayList@11035}  size = 1
 0 = {Object[2]@11093} 
   0 = "string"
   1 = {FooBar@11095} "FooBar(cId=string, internalcId=123456789012, createdAt=2011-11-02 02:59:12.208, collectedAt=2017-10-06 14:26:26.544)"

如何遍历这个结果?

【问题讨论】:

  • 这是 Spring Data JPA 而不是 JPA API。即没有这样的JPA @Query。也许正确标记您的问题

标签: java spring jpa spring-boot


【解决方案1】:

如果您想使用投影而不获得Object[] 结果,则需要在 jpa 查询中创建一个结果类并使用特殊语法。

package com.example

class ResultClass{

   int fieldOne;
   String fieldTwo;

  public (int fieldOne, intfieldTwo){
     // .. set fields
  }

}

和查询:

@Query("SELECT distinct new com.example.ResultClass(LBL.cId, LBL.strProperty) from FooBar LBL ORDER BY LBL.collectedAt DESC")
    List<ResultClass> findDistinctcIdOrderByCollectedAtDesc();

【讨论】:

    【解决方案2】:

    您的查询正在请求 2 个属性。 您可以创建一个自定义类作为 id 和对象,或者您可以从 SELECT 中删除 LBL.cId

    您的要求应该是:

    @Query("SELECT distinct LBL from FooBar LBL ORDER BY LBL.collectedAt DESC")
    List<FooBar> findDistinctcIdOrderByCollectedAtDesc();
    

    distinct 正在处理整个 Row。看一下,如果不放心可以使用group by LBL

    https://stackoverflow.com/a/10066187/3543153

    【讨论】:

    • 但是这个查询会给我什么结果呢?对哪一列应用了不同的条件?
    • 我更新了我的答案。对整行进行不同的工作。您还可以将 distinct 替换为 group by
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 2018-08-03
    • 2023-03-09
    • 2015-11-12
    • 2019-04-07
    • 2016-11-20
    • 2019-03-22
    • 1970-01-01
    相关资源
    最近更新 更多