我的JPQL查询有什么问题?

时间:2016-10-16 04:36:33

标签: jpa spring-boot spring-data spring-data-jpa jpql

我正在尝试实现加入,但我遇到了错误。我有产品表和商店表。 product表通过外键引用store表,如下所示:

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 ERROR 16132 --- [主要]   o.s.boot.SpringApplication:应用程序启动失败

     

org.springframework.beans.factory.UnsatisfiedDependencyException:   创建名为'catalogueServiceController'的bean时出错:   通过字段'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中)!   等等....

我的查询中有什么错误?

1 个答案:

答案 0 :(得分: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周围的某个地方找到一些无效的引用,实际上是在堆栈跟踪的深处。