2017-03-20 19 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などのフィールドと私は私に例外を与えている@queryアノテーションで春リポジトリで実行した場合、私は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。私は、OrderDetailの名前を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

あなたのクエリは、Hiberateが理解する有効な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>に割り当てているが、クエリにいくつかの結合があるため、クエリの結果がProductエンティティではないことを意味します。

ネイティブクエリを実行できます。例:

@PersistenceContext 
private EntityManager entityManager; 

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