我在使用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;
}
答案 0 :(得分:1)
由于执行数据库内聚合以计算自己的出价的MIN和其他出价的MIN,因此无法将本机查询的结果简单地映射到实体。特别是,您的Item
实体没有任何属性来保存myBid
或lowestbid
。
因此,您想从查询方法中返回的是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)
返回类型为“项目”对象的列表,并且指定的查询包含不属于返回对象的列。我建议使用适当的实体,该实体完全填写您的响应类型。