2016-04-25 4 views
0

Предположим, что у меня есть 3 таблицыКак конвертировать Native запрос в JPA Query

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. Или любые другие решения, которые могут получить один и тот же результат, были бы хорошими. Большое спасибо

+0

Почему вы не можете использовать 'NativeQuery'? – HAYMbl4

+0

Мой проект использует почти запрос JPA. И он использует один метод для сопоставления данных и объекта POJO. Я не хочу использовать другой способ – hieund

ответ

0

Вы можете использовать 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. Это вызовет ошибку в запросе при компиляции.

Native результат запроса можно обернуть в объект POJO look more info

Смежные вопросы