2013-02-06 39 views
1

我正在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是抱怨我提供了一個浮動,而不是一個整數或周圍的其他方法。我嘗試了幾件事,現在我有種想法。我將非常感激和想法,想法,以及如何以強有力的方式完成此建議。

回答

0

我似乎最初我錯過了一些東西 - 我不知道如何。不同部分存在某種問題。所以,做這樣的查詢:它肯定會工作。我試着用以下幾種類型:

Integer 
Float 

而且它的工作如預期進行如下操作:>,<,< =,=>。總之,使用Number和NumberUtils以相當優雅的方式解決了這個問題,因爲NumberUtils和JPA創建了適當的類型,它取得Number的層次結構頂部。