gpt4 book ai didi

jpa - JPQL 等效于使用联合和选择常量的 SQL 查询

转载 作者:行者123 更新时间:2023-12-04 20:29:03 25 4
gpt4 key购买 nike

我编写了一个 SQL 查询,它基本上从多个表中进行选择,以确定哪些表具有自特定日期以来创建的行。我的 SQL 看起来像这样:

SELECT widget_type FROM(
SELECT 'A' as widget_type
FROM widget_a
WHERE creation_timestamp > :cutoff
UNION
SELECT 'B' as widget_type
FROM widget_b
WHERE creation_timestamp > :cutoff
) types
GROUP BY widget_type
HAVING count(*)>0

这在 SQL 中运行良好,但我最近发现,虽然 JPA 可能使用联合来执行“每类表”多态查询, JPQL does not support unions在查询中。所以这让我想知道 JPA 是否有替代品可以用来完成同样的事情。

实际上,我会查询十几个表,而不仅仅是两个,所以我想避免进行单独的查询。出于可移植性的原因,我还想避免执行 native SQL 查询。

在我上面链接的问题中,询问映射到 widget_a 和 widget_b 的实体是否属于同一继承树的一部分。对,他们是。但是,如果我从他们的基类中选择,我不相信我有办法为不同的子实体指定不同的字符串常量,是吗?如果我可以选择一个实体的类名而不是我提供的字符串,那也可能符合我的目的。但我也不知道这是否可能。想法?

最佳答案

我进行了更多的搜索,发现 JPA 的一个(看似晦涩的)功能非常适合我的目的。我发现 JPA 2 有一个 type允许您将多态查询限制为特定子类的关键字,如下所示:

SELECT widget
FROM BaseWidget widget
WHERE TYPE(widget) in (WidgetB, WidgetC)

我发现 JPA(或至少 Hibernate 作为 JPA 实现)允许您使用 type不仅在约束中,而且在选择列表中。这大约是我的查询最终的样子:
SELECT DISTINCT TYPE(widget)
FROM BaseWidget widget
WHERE widget.creationTimestamp > :cutoff

该查询返回 Class 的列表对象。我最初的查询是选择字符串文字,因为这与我可能在 SQL 中所做的最接近。选择 Class在我的情况下实际上更可取。但是,如果我确实更喜欢根据实体的类型选择一个常量,那就是 Oracle's documentation 的确切场景。用于说明 case声明:
SELECT p.name
CASE TYPE(p)
WHEN Student THEN 'kid'
WHEN Guardian THEN 'adult'
WHEN Staff THEN 'adult'
ELSE 'unknown'
END
FROM Person p

关于jpa - JPQL 等效于使用联合和选择常量的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15080555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com