Собственный запрос Spring Data JPA не соответствует соглашению об именовании с проекциями

#java #spring #spring-data-jpa

#java #spring #spring-data-jpa

Вопрос:

Я использую Spring Boot 2.1.3.RELEASE, Spring Data JPA для базы данных PostgreSQL.

В именах столбцов используются символы подчеркивания (например, created_by ), а entity beans — обычный Java camelCase createdBy , getCreatedBy() и т.д.

Я пытаюсь написать собственный запрос с интерфейсом проекции, но получаю обратно null значения. Пример:

 public class MyEntity {
    private String createdBy;
    // getters and setters etc
    // more fields here
}

public interface MyProjection {
    String getCreatedBy();
}

public interface MyRepository extends JpaRepository<MyEntity, Long> {
    @Query(value = "
       SELECT DISTINCT cool_table.* FROM cool_table INNER JOIN
       // more SQL things", nativeQuery = true
    )
    List<MyProjection> searchNative(String filter);
}
  

Когда я запускаю это, я получаю обратно null для столбцов, разделенных подчеркиванием (которые
отлично работает с неродными запросами).

В качестве эксперимента я добавил в свою проекцию метод с именем getCreated_by() , и он работает нормально…

Я не хочу переименовывать все методы в моей проекции, чтобы в их именах были символы подчеркивания, потому что это выглядит некрасиво. Есть ли способ заставить собственные запросы работать вместе с проекциями?

Ответ №1:

Вы можете явно переименовать поля в своем запросе, чтобы они соответствовали желаемым именам методов в вашем интерфейсе проектирования.

 public interface MyProjection {
  String getCreatedBy();
}

public interface MyRepository extends JpaRepository<MyEntity, Long> {
  @Query(
    value = "SELECT cool_table.created_by AS createdBy ...",
    nativeQuery = true
  )
  List<MyProjection> searchNative(String filter);
}
  

Ответ №2:

Просто используйте аннотацию @Column и физически задайте имена столбцов, как в базе данных. Другой вариант — установить для вашей схемы автоматическое создание и посмотреть, какая схема создается автоматически.

Комментарии:

1. Привет, Vinay. Спасибо за ваш ответ. Это не работает. Я попытался явно установить @Column аннотации в интерфейсе проекции, но это все еще не работает.