尝试使用Hibernate实施条件查询,出现“无法解析方法”错误

问题描述

我有一个包含以下各列和对应的POJO类的表

@Entity
@Table(name = "base_quote")
public class BaseQuote {

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column(name = "cc_min")
private int cubicCapacityMin;

@Column(name = "cc_max")
private int cubicCapacityMax;

@Column(name = "car_age_min")
private int carageMin;

@Column(name = "car_age_max")
private int carageMax;

@Column(name = "base_amount")
public double baseAmount;

构造函数,getter和setter

我正在尝试编写一个查询,该查询将返回汽车的baseAmount,其立方容量在cc_min和cc_max之间,并且年龄在carageMin和carageMax之间。我试图获取整行,以便以后可以使用该行的baseAmount。

我正在通过DTO接收汽车的cc和年龄。

private double baseAmount (QuoteDTO quoteDTO) {
    try (Session session = sessionFactory.openSession()) {

        CriteriaBuilder cb = session.getCriteriaBuilder();
        CriteriaQuery<BaseQuote> cq = cb.createquery(BaseQuote.class);
        Root<BaseQuote> root = cq.from(BaseQuote.class);
        cq.select(root).where(cb.gt(root.get("cc_max")),quoteDTO.getCubicCapacity());

        Query<BaseQuote> query = session.createquery(cq);
        List<BaseQuote> results = query.getResultList();
      
    }
    
    return null;
}

我遇到了错误,因为我无法解析cb.gt(root.get("cc_max")方法,我也尝试使用类字段名称cubicCapacityMax而不是cc_max,但是却遇到了相同的错误。我想获得cc_max大于DTO立方容量的行,因此我使用了我正在使用的演示中建议的.gt()。它强调了.gt()括号中的所有内容。我知道这不会产生我真正想要的特定结果,但这是表达式的第一部分。我哪里错了?

enter image description here

解决方法

您会收到此错误,因为使用Path#get(String)并不是类型安全的。如果希望编译器正确解释要返回的类型,请使用元模型表达式。 如果使用字符串参数,则需要指定如下类型:

Expression<Integer> expr = root.<Integer> get("cubicCapacityMax");

使用元模型,可以通过以下方式获得相同的表达式:

Expression<Integer> expr = root.get(BaseQuote_.cubicCapacityMax);

还请注意,字符串参数必须与属性名称(在这种情况下为cubicCapacityMax)相对应,而不与字段的数据库名称(cc_max)相对应。

另请参见: