Java 我可以将这个Mysql查询转换为JPA吗?

Java 我可以将这个Mysql查询转换为JPA吗?,java,mysql,hibernate,jpa,playframework,Java,Mysql,Hibernate,Jpa,Playframework,我非常熟悉SQL,但对Java持久性API非常陌生。我通过Play框架使用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

我非常熟悉SQL,但对Java持久性API非常陌生。我通过Play框架使用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;
此查询的目的是从可分级表中选择两行,但确保比较表中不存在此特定对


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

可以在JPA中进行自连接

看看

从这个例子

    @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"),

乍一看,该查询与JPA中的查询几乎相同。我在那里看到的唯一值得怀疑的东西是兰德和极限。自然地?必须用参数的另一种语法替换:param1等。。除此之外还有什么问题?好的,我可以试着找出什么是兰德和极限的JPA等价物。另一个问题是-当我使用JPA.em.createQueryquery运行这个JPA查询时,由于行与现有类不对应,如何提取结果?在查询中按a.id*rand排序的目的是什么?