Spring 数据 JPA 查询 select 来自一个连接的所有值 table
Spring Data JPA query to select all value from one join table
我在使用 Spring Data JPA select 来自一个 table 和少数其他列的所有值时遇到问题。我正在使用 PostgreSql 数据库,当我通过 PgAdmin 发送查询时,我得到了我想要的值,但是如果我在 Spring Boot Rest returns 中使用它,只有一个 table 值(子查询不工作)。我做错了什么?
@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);
添加项目class
@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;
}
Return 类型是 Item 对象列表,指定的查询包含不属于 return 对象的列。我建议使用适当的实体来填充您的响应类型。
由于为计算自己出价的 MIN 和其他出价的 MIN 而执行的数据库内聚合,您的本机查询的结果不能简单地映射到实体。特别是,您的 Item
实体不携带任何属性来保存 myBid
或 lowestbid
。
因此,您想要从查询方法 return 得到的是一个 Projection。 投影只是与 getter 方法的接口与您的查询 return 编辑的字段完全匹配:
public interface BidSummary {
UUID getItem_id();
String getTitle();
String getDescription();
double getMyBid();
double getLowestbid();
}
注意查询方法 return 是如何 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 select 来自一个 table 和少数其他列的所有值时遇到问题。我正在使用 PostgreSql 数据库,当我通过 PgAdmin 发送查询时,我得到了我想要的值,但是如果我在 Spring Boot Rest returns 中使用它,只有一个 table 值(子查询不工作)。我做错了什么?
@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);
添加项目class
@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;
}
Return 类型是 Item 对象列表,指定的查询包含不属于 return 对象的列。我建议使用适当的实体来填充您的响应类型。
由于为计算自己出价的 MIN 和其他出价的 MIN 而执行的数据库内聚合,您的本机查询的结果不能简单地映射到实体。特别是,您的 Item
实体不携带任何属性来保存 myBid
或 lowestbid
。
因此,您想要从查询方法 return 得到的是一个 Projection。 投影只是与 getter 方法的接口与您的查询 return 编辑的字段完全匹配:
public interface BidSummary {
UUID getItem_id();
String getTitle();
String getDescription();
double getMyBid();
double getLowestbid();
}
注意查询方法 return 是如何 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);