2016-10-16 77 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 
} 

現在,我將展示知識庫

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

現在,錯誤是由於最後兩個查詢實現了連接。我想要做的是獲得所有商店在特定城市或州的產品,如上所見。

我遇到的錯誤是:

錯誤開始的ApplicationContext。要顯示自動配置 報告,請啓用'debug'重新運行您的應用程序。 2016年10月16日 09:53:25.203錯誤16132 --- [主] osboot.SpringApplication:應用程序啓動失敗

org.springframework.beans.factory.UnsatisfiedDependencyException: 錯誤名爲「創造豆catalogueServiceController ': 通過字段'productRepo'表示的不滿足依賴性;嵌套0​​異常是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

好的,您的回答是正確的,只是您忘記在'產品'和'加入'之間添加'p'。查詢應該從Product p連接p.store中選擇p作爲store store.city =:city。休息是正確的。歡呼聲! –