2017-03-20 6 views
2

Les entités sont suiventRequête personnalisée pour extraire des données de plusieurs tables au printemps données Jpa

Tableau de produit

@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 Tableau

@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>(); 

Ces entités génératrices de tableau nommé 'order_detail_productlist' et champs comme suit order_detail_id et productlist_id

Je courais requête suivante dans l'éditeur de MySQL et qui fonctionne

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="?" 

mais quand je cours dans le dépôt de printemps avec @Query annotation qui me donne exception. J'ai essayé de changer le nom de Order_detail en OrderDetail selon les entités mais la même exception dans les deux cas.

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 ] 

ce que je veux. J'essaie d'utiliser de cette façon. Je veux obtenir des données de plusieurs tables, comme des produits qui sont des commandes etc.

Répondre

1

Votre requête n'est pas une requête HQL valide, compréhensible par hiberate. Vous pouvez utiliser une requête SQL native, mais le cas d'utilisation mentionné peut être facilement réalisé avec HQL. Avant cela, permet d'utiliser les cartographies des annotations appropriées pour une association 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>(); 

Produit:

@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>(); 

Et requête:

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 est une ressource pour des débutants de commencer par JPA

0

La façon dont vous faites est pas possible parce que vous assignez le jeu de résultats à List<Product> mais la requête a quelques jointures, cela signifie que le résultat de la requête est pas un produit entité.

Vous pouvez essayer de faire une requête native. Par exemple:

@PersistenceContext 
private EntityManager entityManager; 

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