2012-07-10 86 views
7

我使用JPA,休眠3如果查询参数在Hibernate中为空或空,该如何处理?

String sqlQuery = " FROM TraceEntityVO where lotNumber =:lotNumber and mfrLocId=:mfrLocId and mfrDate=:mfrDate and qtyInitial=:qtyInitial and expDate=:expDate"; 
Query query = entityManager.createQuery(sqlQuery) 
       .setParameter("lotNumber", traceEntityVO.getLotNumber()) 
       .setParameter("mfrLocId", traceEntityVO.getMfrLocId()) 
       .setParameter("mfrDate", traceEntityVO.getMfrDate()) 
       .setParameter("qtyInitial", traceEntityVO.getQtyInitial()) 
       .setParameter("expDate", traceEntityVO.getExpDate()); 

此查询的工作就像一个魅力的时候有没有空或空值。但也有可能为traceEntityVO.getLotNumber(有可能的零值或空值),traceEntityVO.getMfrLocId(),traceEntityVO.getExpDate()。

在这种情况下,值“零”或“”抵靠变量代替检查为空条件。如果我不确定参数值是空还是空,我该如何处理?

我不想根据值动态构建查询,如果为空或空。

这可能吗?

在此先感谢..

回答

2

我觉得你真的不能做,没有一个动态查询。

然而,使用标准API(hibernate)(JPA)构建这样的查询很容易,您是否认为它?

+0

我固定的动态查询。我根据条件构造查询并将构造的查询传递给实体管理器。它的工作..谢谢。 – Prathap 2013-07-16 05:20:05

1

我希望以下代码可以排序您的问题。假设getMfrDate和getExpDate将返回Date对象和其他数字或字符串对象。但是你可以根据返回类型修改IsEmpty。

String sqlQuery = " FROM TraceEntityVO where lotNumber :lotNumber 
and mfrLocId :mfrLocId and mfrDate :mfrDate and qtyInitial :qtyInitial and 
expDate :expDate"; 

Query query = entityManager.createQuery(sqlQuery) 
      .setParameter("lotNumber", isEmpty(traceEntityVO.getLotNumber())) 
      .setParameter("mfrLocId", isEmpty(traceEntityVO.getMfrLocId())) 
      .setParameter("mfrDate", isEmpty(traceEntityVO.getMfrDate())) 
      .setParameter("qtyInitial", isEmpty(traceEntityVO.getQtyInitial())) 
      .setParameter("expDate", isEmpty(traceEntityVO.getExpDate())); 


private String isEmpty(Object obj) { 

    if(obj!=null) { 

     if (obj instanceof java.util.Date) { 
      return " = to_date('"+obj.toString()+"') "; 
     } else if(obj instanceof String) { 
      return " = '"+obj.toString()+"' "; 
     } else if (obj instanceof Integer) { 
      return " = "+obj.toString()+" "; 
      } 
    } 

    return new String(" is null "); 
} 
相关问题