1

私はJPA基準の上に非常に一般的なクエリメカニズムを構築しています。次のようなクエリを説明する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>

そして私はこれを解析し、対応する基準を構築します。現在、さまざまな数値タイプを処理しているため、比較演算子(<、>、<=、=>)に関して問題が発生しています。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は、 ApacheCommonsのNumberUtilsユーティリティクラスです。

提供された入力(Float、Integer、Long、またはDouble)に基づいて数値型を返します。今、私はタイプを提供するメカニズムが必要です

rootQuery<T>.get(propName)

それ以外の場合、JPAは、整数ではなくフロートを提供した、またはその逆であると不平を言っています。いくつか試してみましたが、アイデアが足りなくなりました。これをしっかりと達成する方法について、私は非常に感謝し、考え、アイデア、提案をします。

4

1 に答える 1

0

最初は何かを逃したようです-方法がわかりません。別の部分にある種の問題があります。したがって、次のようにクエリを実行します。確実に機能します。私は次のタイプで試しました:

Integer
Float

そして、次の操作で期待どおりに機能しました:>、<、<=、=>。結論として、NumberとNumberUtilsを使用すると、適切なタイプがNumberUtilsによって作成され、JPAがNumberの階層の最上位にあるため、この問題は非常に洗練された方法で修正されます。

于 2013-02-06T15:03:47.450 に答える