2012-07-10 16 views
7

estoy usando JPA, hibernación 3.¿Cómo se maneja si el parámetro de consulta es nulo o está vacío en hibernación?

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()); 

Esta consulta funciona como un encanto cuando el no había valores vacíos o nulos. Pero podría haber un valor nulo o vacío para traceEntityVO.getLotNumber(), traceEntityVO.getMfrLocId(), traceEntityVO.getExpDate().

En este caso el valor 'nulo' o '' se compara con la variable en lugar de es nulo condición. ¿Cómo manejo cuando no estoy seguro del valor del parámetro, nulo o vacío?

No quiero construir la consulta de forma dinámica en función de los valores si está vacío o nulo.

¿Esto es posible?

Gracias de antemano ..

Respuesta

2

creo que realmente no puede hacerlo sin una consulta dinámica.

Sin embargo, la construcción de una consulta es fácil con los criterios API (hibernate) (JPA), ¿lo considera?

+0

He corregido con la consulta dinámica. Construí consultas basadas en las condiciones y pasé la consulta construida al administrador de entidades. Funciona ... Gracias. – Prathap

1

Espero que el siguiente código pueda ordenar su problema. Asumiendo getMfrDate y getExpDate devolverá Date Object y otros objetos Number o String. Pero puede modificar IsEmpty según los tipos de devolución.

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 "); 
} 
Cuestiones relacionadas