我正在JPA標準之上構建一個高度通用的查詢機制。我得到一個描述查詢的XML輸入,如下所示:JPA 2條件爲gt運算符提供運行時類型
<?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>
我解析這個東西,並建立相應的標準。目前我遇到了一個問題,它涉及到比較運算符(<,>,< =,=>),因爲我處理不同的數字類型:我的字段包含Float,Integer或Long值。所以,當我映射我做這樣的事情:
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 utility class
返回根據所提供(浮點型,整型,long或double)的輸入數值類型。現在我需要一個機制,還提供了類型爲
rootQuery<T>.get(propName)
在運行,否則,JPA是抱怨我提供了一個浮動,而不是一個整數或周圍的其他方法。我嘗試了幾件事,現在我有種想法。我將非常感激和想法,想法,以及如何以強有力的方式完成此建議。