Spring-Data-Jpa:使用子查询进行INNER JOIN

时间:2018-10-24 14:27:20

标签: java mysql hibernate jpa spring-data-jpa


我有以下问题。我想在我的spring boot项目中执行此查询。我试图通过JPA存储库界面中的查询注释来做到这一点。但它在内部联接上说“意外的SELECT”。当我直接在mySQL数据库上执行此查询时,它将起作用。

有人对此案有解决方案吗?

这是我的查询:

SELECT t1.*
FROM az_manager t1
INNER JOIN
(
    SELECT maID, MAX(datum) AS max_date
    FROM az_manager
    WHERE maID IN (7243, 1)
    GROUP BY maID
) t2
   ON t1.maID = t2.maID AND t1.datum = t2.max_date
WHERE
    t1.maID IN (7243, 1);

这是我的课程:

@Entity
@Table(name = "az_manager")
@IdClass(TnsWorkingHoursManagerId.class)
@Getter
@Setter
public class TnsWorkingHoursManager extends TnsObject{

    @Id
    @Column(name = "datum")
    private long date;

    @Id
    @Column(name = "maid")
    private int employeeId;

    @Column(name = "typid")
    private int typeId;

    @Column(name = "bemerkung")
    private String comment;

    @Column(name = "host")
    private String host;

    @Column(name = "modus")
    private byte mode;

    public TnsWorkingHoursManager() {
    }

}

这是我尝试使用JPA存储库的情况:

@Query(value = "SELECT azm1 FROM az_manager azm1 INNER JOIN (SELECT maID, MAX(datum) AS max_date FROM az_manager WHERE maID IN(:userIds) GROUP BY maID) azm2 ON azm1.maID = azm2.maID AND azm1.datum = azm2.max_date WHERE azm1.maID IN (:userIds)")
    List<TnsWorkingHoursManager> getLastEntries(@Param("userIds") ArrayList<Integer> userIds);

在第二个选择处显示“'SELECT'突如其来”

2 个答案:

答案 0 :(得分:1)

我找到了解决方案。 我忘了在行的末尾但在括号中添加“,nativeQuery = true”。现在可以了。

答案 1 :(得分:1)

对于可能偶然发现此问题的其他人:

如果您没有在Spring Repository中的end_time = 2018-10-21 apiHours = 23 localDate = 2018-10-19 localHours = 17 fansOnline = 28 批注中添加nativeQuery = true参数,则该查询将被视为用JPQL编写。

从JPQL docs

  

子查询可以在WHERE或HAVING子句中使用。

基于上面的引用,JPQL(Java持久性查询语言)不支持FROM子句中的子查询,这就是为什么OP必须将查询本机化才能起作用。