Метод запроса Hibernate требует, чтобы все столбцы возвращались в запросе? - PullRequest
0 голосов
/ 29 ноября 2018

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

Я не могу группировать по id, поскольку это нарушит группировку.

      @Query(nativeQuery = true, value = "SELECT description, model_year, take_rate, number " +
          "FROM foo f " +
          "INNER JOIN bar b " +
          "ON b.cycle_plan_code = b.cycle_plan_code " +
          "WHERE b.programme = :programme " +
          "AND b.build_event = :buildEvent " +
          "AND f.vehicle_line = :vehicleLine " +
          "GROUP BY description, take_rate, model_year, number")
  List<FooEntity> findAllFooByBar(@Param("vehicleLine") String vehicleLine, @Param("programme") String programme,
                                          @Param("buildEvent") String buildEvent);

У моего объекта есть столбец @Id и некоторые другие

@Table(name = "foos")
public class FooEntity {

  @Id
  private Long id;

  @Column(name = "cycle_plan_code")
  private String cyclePlanCode;

  @Column(name = "model_year")
  private String year;

  @Column(name = "vehicle_line", nullable = true)
  private String vehicleLine;

  @Column(name = "number")
  private Integer number;

  @Column(name = "description")
  private String description;

  @Column(name = "take_rate")
  private double takeRate;

}

При доступе к методу репозитория он выдает hibernate

o.h.engine.jdbc.spi.SqlExceptionHelper   : Column 'id' not found.

Я попытался взломать его, добавив это в предложение select

SELECT 0 as id

Это прогрессирует, однако затем жалуется, что запрос не возвращает другие столбцы для объекта vehicle_line, model_year Мне пришлось добавить их все в запросзаставить это работать.

Я попробовал флаг nullable = true в аннотации, но это не позволило мне опустить столбцы в предложении select.

Как я могу вернуть сущности только с некоторыми возвращаемыми столбцамичто меня интересует?

1 Ответ

0 голосов
/ 29 ноября 2018

Попробуйте использовать проекции: объявите интерфейс с получателями нужных полей:

public interface SubFooEntity{
String getDescription();
String getModelYear();
Double getTakeRate();
Integers getNumber(); 
}

Измените метод хранилища на следующий:

 @Query("SELECT description, modelYear, takeRate, number " +
      "FROM foo f " +
      "INNER JOIN bar b " +
      "ON b.cyclePlanCode = b.cyclePlanCode " +
      "WHERE b.programme = :programme " +
      "AND b.build_event = :buildEvent " +
      "AND f.vehicle_line = :vehicleLine " +
      "GROUP BY description, takeRate, modelYear, number")


List<SubFooEntity> findAllFooByBar(@Param("vehicleLine") String vehicleLine, @Param("programme") String programme,
                                          @Param("buildEvent") String buildEvent);

Подробнее об этом здесь: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections

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