Spring Data JPA查询以从一个联接表中选择所有值

时间:2018-09-04 07:43:00

标签: spring postgresql spring-boot spring-data-jpa jpql

我在使用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 :(得分:1)

由于执行数据库内聚合以计算自己的出价的MIN和其他出价的MIN,因此无法将本机查询的结果简单地映射到实体。特别是,您的Item实体没有任何属性来保存myBidlowestbid

因此,您想从查询方法中返回的是Projection投影只是一个接口,具有与您的查询返回的字段完全匹配的getter方法:

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);

答案 1 :(得分:0)

返回类型为“项目”对象的列表,并且指定的查询包含不属于返回对象的列。我建议使用适当的实体,该实体完全填写您的响应类型。