我正在 JPA Criteria 之上构建一个高度通用的查询机制。我得到一个描述查询的 XML 作为输入,如下所示:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<Criteria xmlns='criteria' maxResults='2'>
<Expression>
<CompareRestriction propertyType='Date' operator='GREATER_THAN_OR_EQUALS' propertyName='deliveryDate'>2010-07-02</CompareRestriction>
<CompareRestriction propertyType='Float' operator='GREATER_THAN_OR_EQUALS' propertyName='weight'>10f</CompareRestriction>
<Restriction operator='NOT_NULL' propertyName='maxDiameter'/>
<LogicalExpression operator='OR'>
<LeftHandSideCompare propertyType="Integer" operator="EQUALS" propertyName="weight">31</LeftHandSideCompare>
<RightHandSide operator='NOT_NULL' propertyName='lastChangedDate'/>
</LogicalExpression>
<LogicalExpression operator='OR'>
<LeftHandSideCompare propertyType="Integer" operator="EQUALS" propertyName="weight">31</LeftHandSideCompare>
<RightHandSide operator='NOT_NULL' propertyName='lastChangedDate'/>
</LogicalExpression>
</Expression>
<Order propertyName='deliveryDate' type='DESC'/>
</Criteria>
我解析这个东西并建立相应的标准。目前,当我处理不同的数值类型时,我遇到了比较运算符(<、>、<=、=>)的问题:我有浮点、整数或长整型值的字段。因此,当我映射时,我会执行以下操作:
switch (leftHandSideCompareRestriction.getOperator().value()) {
...
case "LESS_THAN" : innerPredicates.add(criteriaBuilder.gt(rootQuery.<Number>get(propName), NumberUtils.createNumber((value))));
case "LESS_THAN_OR_EQUALS" : innerPredicates.add(criteriaBuilder.gt(rootQuery.<Number>get(propName), NumberUtils.createNumber(value)));
...
}
NumberUtils 是apache commons NumberUtils 实用程序类
根据提供的输入(浮点、整数、长整数或双精度)返回数值类型。现在我需要一种机制来为
rootQuery<T>.get(propName)
在运行时,否则 JPA 会抱怨我提供了 Float 而不是 Integer 或其他方式。我尝试了几件事,现在我有点想不通了。对于如何以稳健的方式实现这一目标,我将不胜感激并提出想法、想法和建议。