尝试使用 Hibernate 实现条件查询,出现 "cannot resolve method" 错误

Trying to implement a criteria query using Hibernate, getting "cannot resolve method" error

我有一个 table 包含以下列和相应的 POJO class

@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

我正在尝试编写一个查询,该查询将 return 汽车的 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") 的方法 我也尝试使用 class 字段名称 cubicCapacityMax 而不是 cc_max,但我得到同样的错误。我想获取 cc_max 大于 DTO 立方容量的行,因此我使用了我正在使用的演示中建议的 .gt() 。它强调了 .gt() 括号中的所有内容。我知道这不会产生我实际正在寻找的特定结果,但它是表达式的第一部分。我哪里错了?

您收到错误是因为使用 Path#get(String) 不是 type-safe。如果希望编译器正确解释要返回的类型,请使用元模型表达式。 如果你使用字符串参数,你需要像这样指定类型:

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

使用元模型,可以这样得到相同的表达式:

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

另请注意,字符串参数必须对应于 属性 的名称(在本例中为 cubicCapacityMax),而不是字段的数据库名称(cc_max)。

另请参阅: