2017-06-26 4 views
0

JPQLという質問をJPQLで作成しましたが、私の単体テストでは失敗しました。プロジェクトには2つのエンティティがあります。Spring Data JpaでJPQLと照合します

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 
} 

それは、このクエリを使用して正常に動作します:

私は Prodのために新しいプロパティ brandNameを追加し、 left joinでクエリをリファクタリング場合
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); 
} 

はしかし、それはテストが失敗します。

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

問題がProductbrand_idプロパティがないため、ここでon p.brand_id = b.idのようです、それは単なる列名です。だから私はこの作品を作ることができますか?

更新:

だけで、次のようにそれを修正し、JPQLクエリ内のいくつかのsytaxエラーがあるようになった:

@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

関連する問題