2017-03-20 10 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 등의 분야와 내가 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="?" 

작동 되나

을 productlist_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); 

나는 여러 테이블에서 데이터를 가져오고 싶습니다.

답변

1

쿼리가 유효한 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", 
     [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(); 
}