2017-03-20 64 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(); 
}