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,但我们已经知道如何克服此问题。感谢您的回答,我将与我的同事一起评估此解决方案。