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