2017-03-20 65 views
2

實體被以下定義查詢用於在彈簧獲取從多個表中的數據的數據JPA

產品表

@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 

的OrderDetail表

@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註釋,是給我的異常運行。我試圖根據實體將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); 

我想從多個表中獲取數據,例如orderes等產品。

回答

1

您的查詢不是有效的HQL查詢,該查詢可以理解。您可以使用本機SQL查詢,但所提到的用例可以通過HQL輕鬆實現。在此之前,讓我們使用多對多關聯合適的註釋映射:

@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", 
     [email protected](name="order_detail_id", referencedColumnName="id"), 
     [email protected](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); 

Here是初學者友好的資源入手JPA

0

由於您正在將結果集分配給List<Product>,但您查詢的結果並不是一個產品實體,因此您無法執行此操作。

您可以嘗試執行原生查詢。例如:

@PersistenceContext 
private EntityManager entityManager; 

public List<Object[]> customQuery(int id) { 
    Query nativeQuery = entityManager.createNativeQuery(product_ordered).setParameter("id",id); 
    return nativeQuery.getResultList(); 
}