2016-10-16 4 views
0

私は結合を実装しようとしていますが、私はエラーに直面しています。私は製品テーブルとストアテーブルを持っています。外部キーによる製品の表参照ストアのテーブルの下に示すように:JPQLクエリの何が問題ですか?

Product.java

@Entity 
public class Product { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long pId; 
    private String model; 
    private String brand; 
    private byte[] image; 
    private Long price; 
    private String currency; 
    private String transmissionType; 
    private String fuelType; 

    @ManyToOne 
    @JoinColumn(name="storeId") 
    private Store store; 

    // … getters and setters 
} 

さて、私は今Store.java

@Entity 
public class Store { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long storeId; 
    private String locality; 
    private String city; 
    private String state; 
    private String zipCode; 
    private String phone; 

    // … getters and setters 
} 

を示し、Iが示しますレポジトリ

public interface ProductRepo extends JpaRepository<Product, Long> {  

    @Query("select p from Product p join p.storeId s where p.storeId = s.storeId and s.city = :city") 
    public List<Product> findByCity(@Param("city") String city); 

    @Query("select p from Product p join p.storeId s where p.storeId = s.storeId and s.state = :state") 
    public List<Product> findByState(@Param("state") String state); 
} 

ここで、エラーは、結合を実装する最後の2つのクエリが原因です。私がやりたいことは、上記の通り店舗が特に市または州にあるすべての商品を手に入れることです。

私が遭遇したエラーは次のとおりです。ApplicationContextの起動

エラー。自動構成 レポートを表示するには、「デバッグ」を有効にしてアプリケーションを再実行します。 2016年10月16日 09:53:25.203 ERROR 16132 --- [メイン] osboot.SpringApplication: エラー名でBeanを作成する「catalogueServiceController:アプリケーションの起動が

org.springframework.beans.factory.UnsatisfiedDependencyExceptionを失敗しました': ' productRepo 'フィールドで表現されている満足度の低い依存関係。 例外はorg.springframework.beans.factory.BeanCreationExceptionです: 名前 'productRepo'を持つBeanの作成中にエラーが発生しました:initメソッドの呼び出し が失敗しました。入れ子にされた例外はjava.lang.IllegalArgumentExceptionです: メソッドの照会で検証が失敗しましたpublic abstract java.util.List com.practice.rest.assignment1.repository.ProductRepo.findByCity(java.lang.String)! など....

質問にはどのようなエラーがありますか?

答えて

3

クエリが無効です。存在しないp.storeIdを参照してください。私はこのような何かが十分であるべきだと思う:

select p from Product where p.store.city = :city 

または:

select p from Product join p.store as store where store.city = :city 

あなたのJPAプロバイダは、あなたのために正しいことを行うことができるはずように、上部には十分なものでなければなりません。後者は、クエリを最適化するために結合タイプをより具体的にする場合に適しています。

同じことが他のクエリに当てはまります。将来の参照のために、例外スタックトレースを断つことはすべて興味深い部分でした。永続性プロバイダがJPQLを拒否した場合、永続性プロバイダは通常、遭遇するエラーについて非常に具体的です。だから、p.storeIdの周りの何かが、実際にはスタックトレースの深いどこかで無効な参照であることがわかるはずです。

+0

「Product」と「join」の間に「p」を追加するのを忘れた場合を除いて、あなたの答えは正しいです。クエリはstore.city =:cityのstoreとしてProduct p join p.storeからpを選択する必要があります。残りは正しいです。歓声!! –

関連する問題