Spring数据未执行查询

时间:2016-07-13 06:52:16

标签: java spring

我遇到查询执行问题。

这是我的结构:

ProductPrice

@Data
@Entity
@Table(name="\"Product_price\"")
public class ProductPrice {
    @Id
    @SequenceGenerator(name="product_price_id_seq",
            sequenceName="product_price_id_seq",
            allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
            generator="product_price_id_seq")
    private long id;
    private Float price;
    private Date date_from;
    @ManyToOne
    private Product product;
}

这是我的 ProductPriceDto

@Data
public class ProductPriceDto implements Serializable {
    public Float price;
    public Date date;
}

这是我的 PriceRepository

public interface PriceRepository extends CrudRepository<ProductPrice, Long> {
    public static final String FIND_LAST_PRICE = "SELECT p.price, MAX(p.date_from) FROM ProductPrice p WHERE p.product = ?1 GROUP BY p.product";

    @Query(FIND_LAST_PRICE)
    ProductPriceDto findPrice(@Param(value = "product") Long product);

    @Override
    List<ProductPrice> findAll();
}

现在,当我尝试在 PriceRepository 上执行findPrice时,我收到错误:

  

java.lang.IllegalArgumentException:参数值[1]不匹配   期望类型[com.eternity.model.Product(n / a)]]

我做错了什么?

修改

尽管我从Wim那里收到了很好的答案,但我还是决定选择:

ProductPrice findFirstByProductIdOrderByDateFromDesc(@Param(value = "product") Long product);

2 个答案:

答案 0 :(得分:3)

您的查询方法需要Long作为方法参数,但在您的JPQL查询中,您需要Product

将查询方法参数更改为Product

答案 1 :(得分:1)

ProductPrice模型类具有Product product属性,而不是Long product,因此您有此错误。

您应该将 PriceRepository 更改为

public interface PriceRepository extends CrudRepository<ProductPrice, Long> {
    public static final String FIND_LAST_PRICE = "SELECT p.price, MAX(p.date_from) FROM ProductPrice p WHERE p.product = ?1 GROUP BY p.product";

    @Query(FIND_LAST_PRICE)
    List<ProductPrice> findPrice(@Param(value = "product") Product product);

    @Override
    List<ProductPrice> findAll();
}