当前位置: 首页 > 知识库问答 >
问题:

将本机查询重构为JPQL查询

公羊光明
2023-03-14

假设我们有下表,命名为“文档”:

id | createDate | createBy | updateDate | updateBy
--------------------------------------------------
(various rows here)

两个*日期列是时间戳,而另一个都是字符串(甚至是id

目前我在Spring存储库中使用了以下本机查询:

select COUNT(distinct(u.user_working_total)) 
     from
(
    select distinct(createBy) user_working_total
    from documents
    where createDate >= :startDate and 
    createDate <= :endDate

    union

    select distinct(updateBy) user_working_total
    from documents
    where updateDate >= :startDate and 
    updateDate <= :endDate
) as u

如您所见,这必须用作本机查询,因为JPA不支持from子句中的选择查询。现在我必须将此查询转换为JPQL查询,以使其独立于数据库。这在某种程度上是可能的吗?欢迎其他方法,例如使用规范或类似的...

共有1个答案

翟俊
2023-03-14

你说你

想要有一个独立于数据库的查询。

我想你可能已经有了。

SQL语句是一个相当简单的语句,虽然我不会假装知道那里的每SQL方言,但我希望它能与许多数据库一起工作,很可能与所有相关的数据库一起工作。

因此,我的主要建议是设置测试,对需要支持的所有数据库进行测试,并检查其是否有效。

如果坚持使用JPQL,以下方法可能会奏效:

添加一个实体/表Two,只有一列(id)和两个条目:12

您可以按如下方式构造查询:

select
    count(distinct coalesce(t.id, 1, d.createDate, 2, d.updateDate))
from Documents d, Two t
where (t.id = 1
    and d.createDate >= :startDate 
    and d.createDate <= :endDate)
or (t.id = 2
    and d.updateDate >= :startDate 
    and d.updateDate <= :endDate)

不确定是否支持计数(函数(x))。

 类似资料:
  • 是否可以将像这样的JPQL sting转换为对象,在该对象中我可以检查查询的根是否为(使用),或者以不同的方式执行相同的操作(不转换为)? JPA文档非常简单(例如,的类注释说“返回一个CriteriaBuilder的实例以创建CriteriaQuery对象。”-10或20个句子和更多的引用也无妨)。因此,它没有提到任何关于反转进程的内容。 将jpql连接查询转换为条件api以及如何将带有子查询的

  • 我试图将下面的PostgreSQL查询转换为本机查询,但遇到错误。 Postgres查询: 本机查询: 但我得到了以下错误: 无法提取结果集;SQL [n/a];嵌套异常是 org.hibernate.exception.SQLGrammarException: 无法提取 ResultSet

  • 问题内容: 如何限制JPQL命名查询的选择查询?我需要在查询级别本身而不是在Java层中完成限制!!!我正在尝试使用 但徒劳!!! 请建议 问题答案: 没有提供限制查询的机制。这通常是通过使用上的方法来实现的。如果必须避免在Java代码中指定此内容,则可以在包含查询并执行限制的数据库中进行查看。然后像将表一样将实体映射到此视图。 例:

  • 我想知道是否有可能通过spring jpa存储库执行jpql查询,并能够使用分页作为排序功能,就像使用示例和规范一样。我想做一些类似的事情: QueryByQuestpleExector接口,即声明: JpaSpecificationExector接口声明:

  • 我想在我的repo中写一个本机查询“Select*in from table”。表名与实体名不同。 运行查询时, 1如果我把实体名称返回表未找到。 2如果我将表名放在查询中,则查询的验证失败。 问题是 如果我使用"Select*from TariffPacks r2..., nativeQuery=true",我得到错误TariffPacks不存在。如果我使用"Select*from RECHAR

  • 这是从下面提到的SQL查询创建的JPQl查询: “org.springframework.dao.invalidDataAccessResourceUsageException:无法提取ResultSet;SQL[n/a];嵌套异常为org.hibernate.exception.sqlgrammarexception:无法提取ResultSet” 请问上述例外情况我能做些什么?