将本机查询重构为 JPQL 查询

Refactor native query to JPQL query

假设我们有以下 table,命名为 'documents':

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

两个 *date 列是时间戳,而其他都是字符串(甚至 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 查询,以使其独立于数据库。这在某种程度上可能吗? 欢迎使用其他方法,例如使用 Specification 或类似的...

你声明你

want to have a database independent query.

我想你可能已经有了。

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

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

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

添加只​​有一列 (id) 和两个条目的 entity/table Two12.

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

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)

Not sure if count( function(x)) is supported or not