【问题标题】:How to convert Native Query to JPA Query如何将本机查询转换为 JPA 查询
【发布时间】:2016-04-25 11:07:53
【问题描述】:

假设我有 3 张桌子

STUDENT
----------------------
STUDENT_ID | FULL_NAME
======================

SUBJECT
-----------------------------------------------------------------------
SUBJECT_ID | SUBJECT_NAME | STATUS | START_DATE | END_DATE | STUDENT_ID
=======================================================================

CLAZZ
-------------------------------------------
CLAZZ_ID | CLAZZ_NAME | STATUS | STUDENT_ID
===========================================

我想获取学生在一段时间内学习的科目和课程的数量。所以我可以使用这个原生 SQL:

WITH SUBJECT_COUNT AS (
    SELECT STUDENT_ID, COUNT(*) AS SUB_COUNT
    FROM SUBJECT
    WHERE STATUS=1 AND DateParam >= START_DATE AND DateParam <= END_DATE
    GROUP BY STUDENT_ID
), CLAZZ_COUNT AS (
    SELECT STUDENT_ID, COUNT(*) AS CLZ_COUNT
    FROM CLAZZ
    WHERE STATUS=1
    GROUP BY STUDENT_ID
)
SELECT S.STUDENT_ID, S.FULL_NAME, SC.SUB_COUNT, CC.CLZ_COUNT
FROM STUDENT S 
    LEFT JOIN SUBJECT_COUNT SC ON S.STUDENT_ID=SC.STUDENT_ID
    LEFT JOIN CLAZZ_COUNT CC ON S.STUDENT_ID=CC.STUDENT_ID
ORDER BY SC.SUB_COUNT, CC.CLZ_COUNT

如何将此原生 SQL 转换为 JPA 2.1 SQL。或者我可以获得相同结果的任何其他解决方案都会很好。 非常感谢

【问题讨论】:

  • 为什么不能使用NativeQuery
  • 我的项目几乎使用了 JPA 查询。它使用一种技术来映射数据和 POJO 对象。我不想用其他方式

标签: sql jpa subquery


【解决方案1】:

你可以使用EntityManager.createNativeQuery,如果你没有具体的理由应该使用HQL,这是正常的。使用本机查询的最简单方法是:

    em.createNativeQuery("WITH SUBJECT_COUNT AS ( " +
            "    SELECT STUDENT_ID, COUNT(*) AS SUB_COUNT " +
            "    FROM SUBJECT " +
            "    WHERE STATUS=1 AND DateParam >= :START_DATE AND DateParam <= :END_DATE " +
            "    GROUP BY STUDENT_ID " +
            "), CLAZZ_COUNT AS ( " +
            "    SELECT STUDENT_ID, COUNT(*) AS CLZ_COUNT " +
            "    FROM CLAZZ " +
            "    WHERE STATUS=1 " +
            "    GROUP BY STUDENT_ID " +
            ")\n" +
            "SELECT S.STUDENT_ID, S.FULL_NAME, SC.SUB_COUNT, CC.CLZ_COUNT " +
            "FROM STUDENT S  " +
            "    LEFT JOIN SUBJECT_COUNT SC ON S.STUDENT_ID=SC.STUDENT_ID " +
            "    LEFT JOIN CLAZZ_COUNT CC ON S.STUDENT_ID=CC.STUDENT_ID " +
            "ORDER BY SC.SUB_COUNT, CC.CLZ_COUNT").setParameter("START_DATE", startDate).setParameter("END_DATE", endDate).getSingleResult();

您可以对实体上的@NamedNativeQuery 注释进行查询,然后对于创建查询,您需要使用EntityManager.createNamedQuery 而不是EntityManager.createNativeQuery。这将在编译时的查询中看到错误。

您可以将本机查询结果包装到 POJO 对象look more info

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 2020-10-21
    • 2018-03-13
    • 1970-01-01
    • 2017-11-01
    • 2023-04-01
    • 2021-03-13
    • 2012-09-28
    • 2019-01-22
    相关资源
    最近更新 更多