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);
問題がProduct
にbrand_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
クラスを意味します)。それで、それを扱う良い方法はありますか?どんな助けもありがとう。