9

我正在使用 JPA,休眠 3。

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(),可能存在 null 或空值。

在这种情况下,值 'null' 或 '' 会根据变量而不是null条件进行检查。当我不确定参数值是空还是空时,我该如何处理?

我不想根据值为空或 null 的值动态构造查询。

这可能吗?

提前致谢..

4

2 回答 2

2

我认为如果没有动态查询,您真的无法做到这一点。

但是,使用标准 API ( hibernate ) ( JPA )构建这样的查询很容易,您考虑过吗?

于 2012-07-10T12:19:27.767 回答
2

我希望以下代码可以解决您的问题。假设 getMfrDate 和 getExpDate 将返回 Date 对象和其他 Number 或 String 对象。但是您可以根据返回类型修改 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 ");
 }  
于 2012-07-10T22:02:35.223 回答