Моя таблица не отображается при использовании изменений и запроса аннотаций? - PullRequest
0 голосов
/ 28 апреля 2019

Я использую аннотации @Modifying и @Query для непосредственного выполнения моего оператора sql, но получаю сообщение об ошибке, сообщающее, что моя таблица не отображена, поэтому я не знаю, что я делаю неправильно. Вот мой код:

@Repository
public interface TypesContratDaoJPA extends CrudRepository<Type, Long> {

    @Query("select type_id from declaration_type where declaration_id=:declaration")
    List<Integer> getListTypes(@Param("declaration") int declaration);

    @Modifying
    @Query("insert into declaration_type values(:declaration,:type)")
    void addTypeToContrat(@Param("declaration") int declaration, @Param("type") int type);

    @Modifying
    @Query("delete from declaration_type where declaration_id=:declaration and type_id=:type")
void deleteTypeFromContrat(@Param("declaration") int declaration, @Param("type") int type);

}

Я получаю эту ошибку:

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: declaration_type is not mapped [delete from declaration_type where declaration_id=:declaration and type_id=:type]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:133)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:670)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23)

...
... 
... 
...

Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 28 апреля 2019

Похоже, вы хотите выполнить собственный запрос вместо JPQL.

Чтобы пометить запросы как собственные, необходимо добавить nativeQuery = true как свойство к аннотации @Query. Например, ваш первый запрос должен выглядеть так:

@Query("select type_id from declaration_type where declaration_id=:declaration", nativeQuery = true)
    List<Integer> getListTypes(@Param("declaration") int declaration);

Если вы не добавите nativeQuery = true в аннотацию запроса, запрос считается JPQL-запросом.
Таким образом, чтобы ваш первый запрос работал, у вас должен быть класс с именем declaration_type, аннотированный @Entity и имеющий поля с именами declaration_id и type_id. Чтобы узнать больше об этих типах запросов, вам следует ознакомиться с руководством по JPQL (или с документацией).

...