【问题标题】:How to perform a Non-Polymorphic JPQL query with JPA 1.0?如何使用 JPA 1.0 执行非多态 JPQL 查询?
【发布时间】:2011-10-02 18:33:43
【问题描述】:

假设我有 3 个实体,Basic Sub SubSub。我想选择BasicSub 但不是SubSub

我已经发现在 JPA 2.0 中我可以有这个查询 SELECT b FROM Basic b WHERE TYPE(b) IN (Basic,Sub) 但我必须使用的实现是 apache-openjpa-1.2.3-SNAPSHOT

如何使用 JPA 1.0 完成任务?我对任何事情都持开放态度。我可以查询鉴别器列(普通 SQL 或 JPQL)吗?有某种查询提示吗?不使用继承而是使用某种组合可以解决吗?

感谢您的帮助。谢谢

【问题讨论】:

  • JPA1.2 不存在。也许你的意思是 JPA1.0
  • 8[你是对的。我是尴尬

标签: jakarta-ee orm jpa jpql openjpa


【解决方案1】:

我没有测试,但我认为你需要类似的东西:

SELECT b FROM Basic b WHERE b NOT IN (FROM SubSub)

【讨论】:

  • 这是一个非常棒的想法 :) 虽然我猜它会是这样的。 SELECT b FROM Basic b WHERE b NOT IN (SELECT s FROM SubSub s) 错了吗?似乎仍然是一种解决方法,但很好:)
  • 是的,但我认为在 JPA 中“SELECT”部分在这种情况下是可选的。无论如何,您的查询也应该有效。但是,我不认为这是一种解决方法,我认为这是正确的方法。事实上,我比 JPA 2.0 更喜欢它。您粘贴的替代方案...(因为您真的想要不是 SubSubs 的 Basics,所以查询是逻辑的。)。如果可行,请不要犹豫,将答案标记为已接受:)
  • 我不会犹豫,非常感谢:) 我只是称之为解决方法,因为我猜你不能选择 Basics 和 SubSubs 将中间的排除在外?!?但谁在乎。反正这不是我需要的......由于我使用的是SingeTableInheritanceSELECT b FROM Basic b WHERE b.id NOT IN (SELECT s.id FROM SubSub s) 会提高性能吗?无论如何,再次感谢。
  • 我认为在这种情况下性能并没有提高,因为 JPA 已经在使用 ID 来检查相等性......而且我认为你做的不太清楚,也不太解耦(例如,如果您更改标识符的名称,或者将来甚至制作复合标识符,此查询将开始失败),所以我认为第一种方法更好恕我直言。
  • 好吧,你告诉我要耐心,我就这样做了!大声笑!
猜你喜欢
  • 2017-11-19
  • 2016-10-13
  • 2019-07-22
  • 2011-07-30
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
相关资源
最近更新 更多