【问题标题】:JPA 2 criteria provide runtime type for gt operatorJPA 2 标准为 gt 运算符提供运行时类型
【发布时间】:2013-01-21 14:21:45
【问题描述】:

我正在 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>

我解析这个东西并建立相应的标准。目前,当我处理不同的数值类型时,我遇到了比较运算符(、)的问题:我有浮点、整数或长整型值的字段。所以当我映射时,我会做这样的事情:

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

根据提供的输入返回数值类型(Float、Integer、Long 或 Double)。现在我需要一种机制来为

rootQuery<T>.get(propName)

在运行时,否则 JPA 会抱怨我提供了 Float 而不是 Integer 或其他方式。我尝试了几件事,现在我有点没有想法了。对于如何以稳健的方式实现这一目标,我将不胜感激并提出想法、想法和建议。

【问题讨论】:

    标签: jpa persistence jpa-2.0 criteria criteria-api


    【解决方案1】:

    我似乎最初错过了一些东西 - 我不确定如何。在不同的部分有某种问题。所以,像这样进行查询:它肯定会工作。我尝试了以下类型:

    Integer
    Float
    

    它对以下操作按预期工作:>、。总之,使用 Number 和 NumberUtils 以非常优雅的方式解决了这个问题,因为适当的类型是由 NumberUtils 创建的,而 JPA 占据了 Number 层次结构的顶部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      相关资源
      最近更新 更多