问题描述
@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()
括号中的所有内容。我知道这不会产生我真正想要的特定结果,但这是表达式的第一部分。我哪里错了?
解决方法
您会收到此错误,因为使用Path#get(String)
并不是类型安全的。如果希望编译器正确解释要返回的类型,请使用元模型表达式。
如果使用字符串参数,则需要指定如下类型:
Expression<Integer> expr = root.<Integer> get("cubicCapacityMax");
使用元模型,可以通过以下方式获得相同的表达式:
Expression<Integer> expr = root.get(BaseQuote_.cubicCapacityMax);
还请注意,字符串参数必须与属性名称(在这种情况下为cubicCapacityMax
)相对应,而不与字段的数据库名称(cc_max
)相对应。
另请参见: