Spring Data JPA 查询从一个连接表中选择所有值
Posted
技术标签:
【中文标题】Spring Data JPA 查询从一个连接表中选择所有值【英文标题】:Spring Data JPA query to select all value from one join table 【发布时间】:2019-02-09 04:32:17 【问题描述】:我无法使用 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;
【问题讨论】:
Item 类是什么样的? @PhilippMerkle,我添加了 Item 类 【参考方案1】:返回类型是 Item 对象列表,并且指定的查询包含不属于返回对象的列。我建议使用适当的实体来填充您的响应类型。
【讨论】:
也许您可以展示如何使用实体连接两个表中具有匹配 id 的两个表。因为我无法加入。【参考方案2】:由于执行数据库内聚合以计算自己出价的 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);
【讨论】:
感谢您的回答。我应该在我的 Item 类或 ItemRepository 中写一个 Projection 吗?BidSummary
接口可以放在你的Item
实体旁边,即在同一个包中。相应的查询方法可以放在任何 JPA 存储库中,例如 ItemRepository
。不过,BidsRepository
似乎更适合。
我需要使用某种注释吗?
我收到此错误:没有 JDBC 类型的方言映射:1111;嵌套异常是 org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
该错误是因为 Hibernate 不知道如何将 UUID 映射到 Postgres 数据类型。请参阅此处获取解决方案:***.com/a/28193142/7492402以上是关于Spring Data JPA 查询从一个连接表中选择所有值的主要内容,如果未能解决你的问题,请参考以下文章
用于在 Spring Data Jpa 中从多个表中获取数据的自定义查询