JPA-запрос Spring Data для выбора всех значений из одной объединяемой таблицы - PullRequest
0 голосов
/ 04 сентября 2018

У меня проблема с выбором всех значений из одной таблицы и нескольких других столбцов с помощью Spring Data JPA. Я использую базу данных PostgreSql, и когда я отправляю запрос через PgAdmin, я получаю значения, которые мне нужны, но если я использую их в Spring, Boot Rest возвращает только одно табличное значение (подзапрос не работает). Что я делаю не так?

@Query(value = "SELECT item.*, MIN(myBid.bid) AS myBid, (SELECT MIN(lowestBid.bid) AS lowestbid FROM bids lowestBid WHERE lowestBid.item_id = item.item_id GROUP BY lowestBid.item_id) FROM item JOIN bids myBid ON item.item_id = myBid.item_id WHERE myBid.user_id = :user_id GROUP BY item.item_id", nativeQuery = true)
public List<Item> findAllWithDescriptionQuery(@Param("user_id") UUID userId);

Добавлен класс предметов

@Data
@Entity(name = "item")
public class Item {
    @Id
    @GeneratedValue
    private UUID itemId;

    @NotNull
    @Column(name = "title")
    @Size(max = 255)
    private String title;

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


    @NotNull
    @Column(name = "created_user_id")
    private UUID createdUserId;
}

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Результат вашего собственного запроса не может быть просто сопоставлен с сущностями из-за агрегирования в базе данных, выполненного для расчета минимума собственных заявок, и минимума других заявок. В частности, ваша сущность Item не имеет никаких атрибутов для хранения myBid или lowestbid.

Следовательно, вы хотите вернуть из метода запроса: Проекция . Проекция - это простой интерфейс с методами получения, совпадающими с полями, возвращаемыми вашим запросом:

public interface BidSummary {

  UUID getItem_id();

  String getTitle();

  String getDescription();

  double getMyBid();

  double getLowestbid();

}

Обратите внимание, как метод запроса возвращает проекцию BidSummary:

@Query(value = "SELECT item.*, MIN(myBid.bid) AS myBid, (SELECT MIN(lowestBid.bid) AS lowestbid FROM bids lowestBid WHERE lowestBid.item_id = item.item_id GROUP BY lowestBid.item_id) FROM item JOIN bids myBid ON item.item_id = myBid.item_id WHERE myBid.user_id = :user_id GROUP BY item.item_id", nativeQuery = true)
public List<BidSummary> findOwnBids(@Param("user_id") UUID userId);
0 голосов
/ 04 сентября 2018

Тип возвращаемого значения - список объектов Item, а указанный запрос содержит столбцы, которые не являются частью возвращаемого объекта. Я рекомендую использовать соответствующий Entity, который заполняет ваш тип ответа.

...