将本机查询重构为 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 Two
: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)
Not sure if count( function(x))
is supported or not。
假设我们有以下 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 Two
: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)
Not sure if count( function(x))
is supported or not。