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 实体不携带任何属性来保存 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);

【讨论】:

感谢您的回答。我应该在我的 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 中从多个表中获取数据的自定义查询

Spring DATA JPA中的关于多表连接的问题

Spring Boot - JPA 或 SQL 查询在连接表中查找最常见的项目?

spring data jpa 一对多查询

Spring Data JPA:创建规范查询获取连接

Spring Boot + 调度程序 + Spring Data JPA + Oracle 中的异常处理