当前位置: 首页 > 面试题库 >

自定义查询,用于从Spring Data Jpa中的多个表中获取数据

田远
2023-03-14
问题内容

实体正在追踪

产品表

@Entity
public class Product implements Serializable {
/*@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;*/

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @NotNull(message = "Product name must not be null")
    @NotEmpty
    private String name;


    @ManyToOne
    @JoinColumn(name="category_id")
    private Category category;

    @ManyToMany(mappedBy = "productlist")
    private List<OrderDetail> orderDetail =new ArrayList<OrderDetail>();

//getters setter

订单明细表

@Entity
public class OrderDetail {

     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Integer id;


     @ManyToOne
     @JoinColumn(name="purchased_By")
     private user PurchasedBy;


    @ManyToMany
     private Set<Product> productlist = new HashSet<Product>();

这些实体生成的表名为“ order_detail_productlist”,其字段如下order_detail_id和productlist_id

我正在mysql编辑器中运行以下查询,并且正在运行

select u.id, r.name from order_detail u inner join order_detail_productlist ur on(u.id=ur.order_detail_id) inner join product r on(ur.productlist_id=r.id) where u.id="?"

但是当我在带有@Query注释的spring存储库中运行时,这给了我异常。我尝试根据实体将Order_detail的名称更改为OrderDetail,但在两种情况下都相同。

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [select r.name from com.example.Domain.OrderDetail u inner join order_detail_productlist ur on(u.id=ur.order_detail_id) inner join Product r on(ur.productlist_id=r.id) where u.id= :id ]

我想要的是 。我正在尝试以这种方式使用。

public final static String product_ordered ="select r.name from OrderDetail u inner join order_detail_productlist ur " +
            "on(u.id=ur.order_detail_id) inner join Product r" +
            " on(ur.productlist_id=r.id)" +
            " where u.id= :id ";

@Query(product_ordered)
public List<Product> findById(@Param("id") int id);

我想从多个表中获取数据,例如订单等产品。


问题答案:

您的查询不是hibernate有效的有效HQL查询。您可以使用本机SQL查询,但是使用HQL可以轻松实现上述用例。在此之前,让我们为ManytoMany关联使用正确的注释映射:

@Entity
@Table(name = "order_detail")
public class OrderDetail {

     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Integer id;


     @ManyToOne
     @JoinColumn(name="purchased_By")
     private user PurchasedBy;


     @ManyToMany
     @JoinTable(
       name="order_detail_productlist",
       joinColumns=@JoinColumn(name="order_detail_id", referencedColumnName="id"),
       inverseJoinColumns=@JoinColumn(name="productlist_id", referencedColumnName="id"))
      private Set<Product> productlist = new HashSet<Product>();

产品:

@Entity
@Table(name ="product")
public class Product implements Serializable {

      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Integer id;

      @NotNull(message = "Product name must not be null")
      @NotEmpty
      @Column(name = "name", nullable = false)
      private String name;


      @ManyToOne
      @JoinColumn(name="category_id")
      private Category category;

      @ManyToMany(mappedBy = "productlist")
      private List<OrderDetail> orderDetail =new ArrayList<OrderDetail>();

并查询:

public final static String product_ordered ="Select p from Product p Join p.orderDetail od Where od.id = :id";

@Query(product_ordered)
public List<Product> findById(@Param("id") int id);

这是从JPA开始的初学者友好资源



 类似资料:
  • 我试图从获取数据。总共有9个表格,我必须相应地从所有表格中显示产品列表。 我考虑过使用连接,并尝试了左连接,如下所示: 这里是主表,pid是从tbl2到tbl9的所有表的。 注意:这里我在所有表上使用了来避免长查询,但是在实际的数据库操作中,只提到特定的列来提高性能。 现在实际的问题是,我没有得到所有的记录从表使用左加入。只检索中对应的每个条目的最后一行。 我使用了GROUP BY来避免重复的左连

  • 问题内容: 我正在尝试一次从三个表中检索数据。这些表如下所示: 类别 讯息 评论 我想要得到的是1条消息(因为我有一个基于id的子句),3个类别(因为有3个类别链接到消息)和2条注释(因为有2条注释链接到消息)。 我正在尝试使用以下查询来检索数据: 但是,当运行此查询时,我得到6个结果: 在我预期结果如下的地方: 只有三行,我应该能够获取所有需要的数据。这有可能吗?我做错了吗?? 问题答案: 如评

  • 我想从JSON列中获取值,并在spring JPA中返回自定义DTO。 表结构 列包含年龄,例如 我想获取具有、和的用户列表。由于数据量可能很大,我创建了一个自定义DTO 下面是一个同样的例子: 实体: 结构: 结构: 启动Spring启动应用程序 警告|上下文初始化期间遇到异常-取消刷新尝试:org。springframework。豆。工厂UnsatifiedPendencyException:

  • 我想这样写一个hql 因为我是新手,请帮帮我

  • 我有两个MySql表用户和标记 用户表: 标记表 我想按降序获取得分最高的前10名用户的详细信息(userid、firstName和lastName)。用户分数定义为用户在不同科目的所有分数之和。 我真的很困惑在这里使用哪个连接,我是MySql新手,这个查询对我来说有点挑战性,希望你理解这个问题。如果你有任何建议,请告诉我,谢谢

  • 我需要创建一个jpa自定义查询,使用几个表上的联接来获取记录。 以下是我想要达到的目标: 对很少的参数进行数据排序(在运行时决定) 使用where子句进行筛选(在运行时决定) 示例: @query(value=“从用户a中选择a.name,b.city,c.reason在a.id=b.id上连接地址b在a.id=c.id上连接测试c 我无法为其创建常规查询。 任何其他的方法对我来说也是可以接受的来