加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 05:00:14 所属栏目:Java 来源:网络整理
导读:我编写了一个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
我编写了一个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是否有一个替代方案可以用来完成同样的事情.

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

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

解决方法

我做了一些搜索,发现JPA的一个(看似模糊的)功能完全符合我的目的.我发现JPA 2有一个类型关键字,允许您将多态查询限制为特定的子类,如下所示:

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

我发现JPA(或至少Hibernate作为JPA实现)允许您不仅在约束中使用类型,还在选择列表中使用类型.这大约是我的查询结果如下:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读