我在使用 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;
}
最佳答案
由于为计算自己出价的 MIN 和其他出价的 MIN 而执行的数据库内聚合,您的 native 查询的结果不能简单地映射到实体。特别是,您的 Item
实体不携带任何属性来保存 myBid
或 lowestbid
。
因此,您希望从查询方法返回的是 Projection . 投影只是一个接口(interface),其 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);
关于Spring Data JPA 查询从一个连接表中选择所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52161241/