我有以下情况:
//...
final Criteria dbCriteriaQuery = sessionFactory.getCurrentSession().createCriteria(User.class);
searchCriterias.forEach(searchCriteria -> addCriteriaRestrictionForUserClass(dbCriteriaQuery, searchCriteria));
final List list = dbCriteriaQuery.list();
//...
private void addCriteriaRestrictionForUserClass(Criteria criteria, SearchCriteria search) {
final SimpleExpression property;
switch (search.getOperator()) {
case ">": property = Restrictions.gt(search.getPropertyName(), search.getSearchValue()); break;
case "<": property = Restrictions.lt(search.getPropertyName(), search.getSearchValue()); break;
case "=": property = Restrictions.eq(search.getPropertyName(), search.getSearchValue()); break;
case "<>": property = Restrictions.ne(search.getPropertyName(), search.getSearchValue()); break;
default: throw new InvalidDtoException();
}
criteria.add(property);
}
我在search.getSearchValue()
获得了例外。问题是,这些值总是字符串,而User.class
的链接属性可以是任何类型。
有没有办法在这里进行自动投射?或者我真的需要先找出属性的类型 - &gt;将String值转换为任何类型的Object,然后将它放入查询中?
有可能做这样的事情:
Restrictions.gtProperty(x, y);
Casting在这里工作,但你需要双方的真实属性,它们以某种方式链接到查询。
我认为这应该在某个地方实施。所有这些算法都必须确定property
的类型并以适当的格式投射value
。