Java 将本机查询重构为JPQL查询

Java 将本机查询重构为JPQL查询,java,spring-data-jpa,jpql,nativequery,Java,Spring Data Jpa,Jpql,Nativequery,假设我们有一个名为“文档”的下表: id | createDate | createBy | updateDate | updateBy -------------------------------------------------- (various rows here) 两个*日期列是时间戳,而另一个则是所有字符串,甚至是id 目前,我在Spring存储库中使用了以下本机查询: select COUNT(distinct(u.user_working_total)) fro

假设我们有一个名为“文档”的下表:

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子句中的select查询。现在我必须将此查询转换为JPQL查询,以使其独立于数据库。这在某种程度上是可能的吗? 欢迎使用其他方法,如使用规范或类似的…

您声明

希望有一个独立于数据库的查询

我想你可能已经有了

SQL语句非常简单,虽然我并不假装知道所有的SQL方言,但我希望它能与许多数据库一起工作,很可能与所有相关的数据库一起工作

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

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

添加一个实体/表2,其中只有一个列id和两个条目:1和2

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

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)

使用@Queryvalue=您的本机sql,nativeQuery=true怎么样?本机查询对哪个数据库不起作用?这就是我们现在所拥有的。我们希望用tu替代本机查询机制。该查询在SQL Server上运行良好,但我们希望有一个独立于数据库的查询。我有不止一个这样的查询,其中一些查询使用了特定于SQL Server的DATEADD,但我们已经知道如何克服此问题。感谢您的回答,我将与我的同事一起评估此解决方案。