【问题标题】:Can I convert this Mysql query to JPA?我可以将此 Mysql 查询转换为 JPA 吗?
【发布时间】:2011-06-17 10:17:03
【问题描述】:

我对 SQL 相当熟悉,但对 Java Persistence API 非常陌生。我通过 Play Framework 使用 JPA。

如果可以的话,我想将以下 MySql 查询转换为纯 JPA 代码:

SELECT a.id, b.id
FROM Rankable a
INNER JOIN Rankable b on a.id < b.id
WHERE 
  a.category_id = ? AND b.category_id = ?
  AND NOT EXISTS (
    SELECT *
    FROM Comparison c
    WHERE c.lower in (a.id, b.id))
  AND NOT EXISTS (
    SELECT *
    FROM Comparison c
    WHERE c.higher IN (a.id, b.id))
ORDER BY a.id * rand()
LIMIT 1;

此查询的目的是从 Rankable 表中选择两行,但确保此特定对不存在于比较表中。

从 Play/JPA 调用这样一个有点复杂的查询的最佳方法是什么?

【问题讨论】:

  • 乍一看,查询看起来与 JPA 中的查询几乎相同。我看到的唯一值得怀疑的是“rand()”和“LIMIT”。自然“?”必须用另一种参数语法(:param1等)替换。除此之外还有什么问题?
  • 好的,我可以尝试找出 rand() 和 limit 的 JPA 等价物是什么。另一个问题是 - 当我运行这个 JPA 查询(使用 JPA.em().createQuery(query))时,我如何提取结果(因为这些行不会对应于现有的类)?
  • 查询中ORDER BY a.id * rand()的目的是什么?

标签: java mysql hibernate jpa playframework


【解决方案1】:

可以在 JPA 中进行自联接。

看看this example

来自示例

    @NamedQuery(name="siblings", query="select distinct sibling1 "
    + "from Deity sibling1, Deity sibling2 where "
    + "sibling1.father = sibling2.father "
    + "and sibling1.mother = sibling2.mother "
    + "and sibling2 = ?1 and sibling1 <> ?1"),

【讨论】:

    猜你喜欢
    • 2018-03-13
    • 2020-10-05
    • 2012-09-28
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多