2017-06-26 77 views
0

我在春季數據jpa中創建了left join查詢,JPQL但在我的單元測試中失敗。項目中有兩個實體。在春季數據中使用JPQL加入查詢Jpa

Product實體:

@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實體:

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

而第三類Prod映射查詢結果對象:

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

它正常工作與此查詢:

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); 
} 

但如果我對Prod增加新屬性brandNameleft join重構查詢時,它測試失敗:

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

這個問題似乎是在這裏on p.brand_id = b.id因爲沒有一個brand_id財產Product,它只是一個列名。那我該如何做這項工作?

更新:

有原來是在JPQL查詢的一些語法時才錯誤,只是修復它,如下所示:

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

此外,它以這種方式來創建另一個類很麻煩每次將查詢結果映射到對象(我的意思是Prod類)。那麼有沒有一種好的方法來處理它?任何幫助,將不勝感激。

回答

3

而不是p.brand_id = b.id你應該做p.brand.id = b.id