【问题标题】:JPA native query with same column twiceJPA本机查询与同一列两次
【发布时间】:2019-03-06 05:12:13
【问题描述】:

我是一名 JPA 新手,想要对单个表(如下)进行 JPA 本机查询,我想在基于 @Entity 的名为 TestRequest 的类中获取该查询。它有一个“RequestTime”列,使用 DAYNAME() 获取,然后使用 DATEDIFF() 函数获取。

SELECT TestRequest.Id AS Id
               , TestRequest.RequestTime AS RequestTime
               , DAYNAME(TestRequest.RequestTime) AS RequestDay
               , TestRequest.StatusMessage AS StatusMessage
               , DATEDIFF(CURDATE(), TestRequest.RequestTime) AS HowLongAgo
            FROM TestRequest
                     LEFT JOIN TestRun
                               ON TestRequest.TestRunId = TestRun.Id
           WHERE Requestor = '[NAME]'
           ORDER BY Id DESC

有什么方法可以将列(第二次作为 HowLongAgo 提取)设置为未映射到 TestRequest 类中的表列的属性?是否有任何字段级别的注释?

【问题讨论】:

  • 也许您可以在您的实体中添加属性 HowLongAgo 并将其标记为 @Transient
  • 谢谢,我想这会奏效。我是否只使用标准 Java 计算 Dayname() 和 Datediff()?
  • 是的,如果你在你的实体中计算 howLongAgo,也许你会更好。但你可以在你的查询中做
  • 你确定可以在查询中完成吗?如果我理解正确@Transient 不会从查询中获取任何内容...
  • 我觉得这篇文章回答的比较详细-vladmihalcea.com/…

标签: spring-boot jpa spring-data-jpa


【解决方案1】:

你需要使用Interface-based projections:

您需要创建一个接口,为投影中的每个字段定义 getter,例如:

public interface RequestJoinRunProjection {
  int getId();
  LocalDate getRequestTime();
  String getMessage();
  String getRequestDay();
  Long getHowLongAgo();
}

然后,您在存储库上定义一个方法,该方法具有您要运行的本机查询:

public interface TestRequestRepository extends CrudRepository<TestRequest, Long> {

  // Any other custom method for TestRequest entity

  @Query(value = "SELECT trq.Id AS id " +
      "   , trq.RequestTime AS requestTime " +
      "   , DAYNAME(trq.RequestTime) AS requestDay " +
      "   , trq.StatusMessage AS statusMessage " +
      "   , DATEDIFF(YEAR, CURDATE(), trq.RequestTime) AS howLongAgo " +
      "FROM TestRequest trq " +
      "         LEFT JOIN TestRun tr " +
      "                   ON trq.TestRunId = tr.Id " +
      "WHERE Requestor = ?1 ORDER BY Id DESC"), nativeQuery = true)
  List<RequestJoinRunProjection> findTestSumary(String name);
}

注意查询必须是原生的,因为您使用的是数据库函数,列名也必须与投影接口的设置器匹配(遵循 bean 规则),因此请使用AS 来更改查询中的名称。

我强烈建议您在注入 @Query 注释之前在 h2 上测试您的查询。 DATEDIFF 需要 3 个参数。

【讨论】:

  • 谢谢!我会试一试,让你知道它是否适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 2012-10-09
  • 1970-01-01
  • 2013-11-07
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多