【问题标题】:JPA how to join these tables [closed]JPA如何加入这些表[关闭]
【发布时间】:2013-05-28 15:24:00
【问题描述】:

我在 Glassfish 上使用 JPA(JQL),下面以这些表为例,我该如何查询来获取

“所有 OrderId 的 shipperID 大于 2 的客户行”

这将是一个有连接但无法弄清楚是哪一个以及如何连接的东西

这张图片取自 w3schools,但很好地代表了我的情况。

【问题讨论】:

  • 如果您使用 JPA 并希望返回 java 实体,您可能希望显示实体及其映射。 jPQL 可能看起来像“select c from Customer c join c.orders order where order.shipperid > 2”
  • @Chris 是您在那里使用的内部联接吗?
  • 为什么反对票和接近票,这个问题有什么问题,只需评论如何改进它而不是像猴子一样反对,因为你在生活中没有更好的事情可做
  • @Spring,也许反对者有他们的理由(那是他们要回答的)。但我真的不认为侮辱他们能取得任何成就。更具建设性的方法是遵循上述第一条评论的建议,显示您的实体类,然后人们可以为这些类建议一个 JPQL 查询……因为毕竟 JPA/JPQL 是基于类而不是表。
  • @DataNucleus 你是对的,这不是关闭和否决问题的正当理由,更具建设性的方法是指出缺少的内容,关闭它可以实现什么?如果我知道 JPA,我不会问它

标签: java sql jpa


【解决方案1】:

SQL 是这样的吗?

SELECT  *
FROM    customertable AS c
        INNER JOIN ordertable AS o 
            ON c.customerid = o.customerid
WHERE   o.shipperid > 2

根据您的 SQL 提供程序,您可能不需要 AS 用于别名表。您可以通过仅选择客户行来进一步:

SELECT c.*

进一步选择唯一的行:

SELECT DISTINCT c.*

这是另一个关于在 JPA 中执行 SQL 的帖子的链接:

Execute some arbitrary sql in the current transaction in JPA 2.0

【讨论】:

  • 虽然在概念上 DISTINCT 更容易,但如果我需要 SELECT DISTINCT c.*我会使用 INEXISTS
  • @twoleggedhorse tnx,我应该在那里使用联接还是内部联接?
  • @Spring rdbms 会自动将“join”读作“inner join”,但我更喜欢完整地写出来,而且我认为它更容易阅读。
  • @twoleggedhorsethansk 我在这里问的问题更清楚,你能检查一下stackoverflow.com/questions/16808695/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多