#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
аннотации в интерфейсе проекции, но это все еще не работает.