【问题标题】:JPQL get difference in days between a column and nowJPQL 得到列和现在之间的天数差异
【发布时间】:2019-06-23 13:55:16
【问题描述】:

我在 Spring Boot 应用程序中使用 hibernate 和 jpa。 我有一个带有 2 列的休眠实体,type(字符串)和date(LocalDate)。

我想选择所有列以及我的日期列与现在之间的天数差异。

我在 PostgreSQL 中成功了:select date, date - current date from table;

我正在使用扩展 JpaRepository 的接口。到目前为止,我已经成功地通过 @Query 注释插入新查询。 我不知道如何选择我的列和包含 jpql 中天数差异的列。

亲切的问候,

【问题讨论】:

  • 如果你只需要选择日期差,为什么不简单地写一个java方法返回当前时间和你的日期列的差?
  • 除了新列之外,我还需要旧对象,日期列和现在的区别。完整的图片是这样的:我的 Angular 前端使用 hibernate 查询 spring 后端以获取休眠实体。我想向该休眠实体添加一个时间列,以显示日期列与现在之间的差异。

标签: postgresql hibernate spring-boot jpql


【解决方案1】:

确实,您可以使用查询创建器。您必须创建一个新实体,该实体具有与原始表相同的列,以及日期列与现在之间的计算差异。您必须小心哪个日期类型是您的列。

根据我的经验,只有 java.util 中的日期可以用于与 CURRENT_DATE 的差异(我可能是错的)。

public List<NewEntity> getTest() {
String queryStr = "select new com.entity.NewEntity(n.type, n.date - CURRENT_DATE as 
time) from Table as n"
TypedQuery<PunteInspectieTimpRamas> query = entityManager.createQuery(queryStr, 
NewEntity.class);

return query.getResults()

}

【讨论】:

  • 成功了!我创建了一个新的 java 类 TableExtra,它有 3 列:类型、日期和时间(时间是双倍的,日期和当前日期之间的差异)。
  • PS: 成功测试后,我现在在 intellij 中收到错误:PSQLException: bad value for type double: 15 days; - 差异是正确的,15,但直到现在它才返回 15,而不是返回 15 天。我错过了什么?
【解决方案2】:

不确定您是否可以使用 jpql 执行此操作。 但是您可以将查询用作本机查询,直接在您的存储库中:

@Query(value = "SELECT ... ", nativeQuery = true) ClassToReturn methodName();

https://www.baeldung.com/spring-data-jpa-query

【讨论】:

  • 是的,这是我尝试过的另一个解决方案,但没有成功 MyClass 返回的是我正在查询的休眠实体。当我使用我的查询时,我试图返回我的实体 + 除了旧对象之外的一列。我在这里看到了类似的东西,不知道该怎么做objectdb.com/java/jpa/query/jpql/…
  • 您的选择中不能有未映射到实体中的额外列。如果你真的想在你的实体中拥有一个不在你的数据库中的属性,你可以在你的实体中添加一个@Transient 属性。然后你可以做的是:在存储库的方法中返回一个Object[](或List&lt;Object[]&gt;)并手动实例化一个实体类并根据列手动设置属性。但是你失去了大部分休眠的好处。
猜你喜欢
  • 2014-10-07
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多