Spring-Data-Jpa: ВНУТРЕННЕЕ СОЕДИНЕНИЕ с подзапросом - PullRequest
0 голосов
/ 24 октября 2018


У меня следующая проблема.Я хочу выполнить этот запрос в моем весеннем загрузочном проекте.Я попытался сделать это с помощью аннотации запроса в интерфейсе репозитория JPA.Но он говорит «неожиданный ВЫБОР» во внутреннем соединении.Когда я выполню этот запрос непосредственно в моей базе данных 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);

При втором выборе он говорит "ВЫБРАТЬ" неожиданный "

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Для всех, кто может наткнуться на этот вопрос:

Если вы не добавите параметр nativeQuery = true к аннотации @Query в репозитории Spring, запрос будет считаться написанным на JPQL.

Из JPQL документов :

Подзапросы могут использоваться в выражении WHERE или HAVING.

На основецитата выше, JPQL (Java Persistence Query Language) не поддерживает подзапросы в предложении FROM, и поэтому OP должен был сделать запрос нативным, чтобы он работал.

0 голосов
/ 24 октября 2018

Я нашел решение.Я забыл добавить ", nativeQuery = true" в конце строки, но в скобках.Теперь это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...