2017-06-26 3 views
0

Ich erstellte eine left join Abfrage mit JPQL im Frühjahr Daten jpa, aber in meinem Komponententest fehlgeschlagen. Es gibt zwei Entitäten im Projekt.Join Abfragen mit JPQL in Spring Data Jpa

Product Einheit:

@Entity 
@Table(name = "t_goods") 
public class Product implements Serializable { 

    @Id 
    @GeneratedValue 
    @Column(name = "id", length = 6, nullable = false) 
    private Integer id; 
    @Column(name = "name", length = 20, nullable = false) 
    private String name; 
    @Column(name = "description") 
    private String desc; 
    @Column(name = "category", length = 20, nullable = false) 
    private String category; 
    @Column(name = "price", nullable = false) 
    private double price; 
    @Column(name = "is_onSale", nullable = false) 
    private Integer onSale; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "brand_id") 
    private Brand brand; 
    // getter and setter 
} 

Brand Einheit:

@Entity 
@Table(name = "tdb_goods_brand") 
public class Brand implements Serializable { 

    @Id 
    @GeneratedValue 
    @Column(name = "id", length = 6, nullable = false) 
    private Integer id; 
    @Column(name = "brand_name", unique = true, nullable = false) 
    private String name; 

    @OneToMany(mappedBy = "brand", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<Product> products; 
    // getter and setter 
} 

Und eine dritte Klasse Prod die Abfrageergebnisse zur Karte Objekt:

public class Prod implements Serializable { 
    private Integer id; 
    private String name; 
    private double price; 
    //private String brandName; 
    // getter and setter 
} 

Es funktioniert mit dieser Abfrage fein :

public interface ProductRepository extends JpaRepository<Product, Integer> { 
    @Query(value = "select new com.pechen.domain.Prod(p.id, p.name, p.price) from Product p ") 
    Page<Prod> pageForProd(Pageable pageRequest); 
} 

Aber wenn ich neue Eigenschaft hinzufügen brandName für Prod und Refactoring die Abfrage mit left join, es Test nicht besteht:

@Query(value = "select new com.pechen.domain.Prod(p.id, p.name, p.price, b.name) from Product p left join com.pechen.domain.Brand b on p.brand_id = b.id") 
Page<Prod> pageForProd(Pageable pageRequest); 

Das Problem hier on p.brand_id = b.id zu sein scheint, weil es keine brand_id Eigenschaft in Product ist, Es ist nur ein Spaltenname. Wie kann ich das schaffen?

Update:

Es stellte sich einige sytax Fehler in der JPQL Abfrage sein, befestigen Sie es wie folgt zusammen:

@Query(value = "select new com.pechen.domain.Prod(p.id, p.name, p.price, b.name) from Product p left join p.brand b") 
Page<Prod> pageForProd(Pageable pageRequest); 

Außerdem ist es sehr mühsam auf diese Weise eine andere Klasse zu erstellen jedes Mal, um die Abfrageergebnisse in Objekt (ich meine die Prod Klasse) abzubilden. Gibt es also einen guten Weg, damit zu arbeiten? Jede Hilfe wäre willkommen.

Antwort

3

Anstelle von p.brand_id = b.id sollten Sie p.brand.id = b.id

tun