尝试使用 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
)。
另请参阅:
我有一个 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
)。
另请参阅: