简体   繁体   中英

How to handle if query parameter is null or empty in hibernate?

I'm using JPA, hibernate 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());

This query works like a charm when the there were no empty or null values. But there could be possible of null or empty value for traceEntityVO.getLotNumber(),traceEntityVO.getMfrLocId(),traceEntityVO.getExpDate().

In this case the value 'null' or '' is checked against the variable instead of is null condition. How do I handle when I'm not sure about the parameter value, either null or empty?

I don't want to construct the query dynamically based on the values if empty or null.

Is this possible?

Thanks in advance..

I think you really can't do that without a dynamic query.

Building such a query however is easy with the criteria API ( hibernate ) ( JPA ), did you consider it?

I hope following code will sort your problem. Assuming getMfrDate and getExpDate will return Date Object and others either Number or String objects. But you can modify IsEmpty according to return types.

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

build your query according to your parameters (null or not) using the conditional statement if() like this example for the date:

String jpqlQuery = "select f from Formation f where f.libelleFormation Like :libelleFormation and f.statutFormation Like :statutFormation and f.codeFormation Like :codeFormation";
        if (critereRecherche.getDateDebFormation() != null) {
        jpqlQuery = jpqlQuery.concat(" and f.dateDebFormation > :dateDebFormation");
        }
        if (critereRecherche.getDateFinFormation() != null) {
        jpqlQuery = jpqlQuery.concat(" and f.dateFinFormation < :dateFinFormation");
        }
        Query query= em.createQuery(jpqlQuery);
    query.setParameter("libelleFormation","%"+critereRecherche.getLibelleFormation()+"%");
    query.setParameter("statutFormation","%"+critereRecherche.getStatutFormation()+"%");
    query.setParameter("codeFormation","%"+critereRecherche.getCodeFormation()+"%");

    if (critereRecherche.getDateDebFormation() != null) {
    query.setParameter("dateDebFormation",critereRecherche.getDateDebFormation(),TemporalTyp.DATE);
    }
    if (critereRecherche.getDateFinFormation() != null) {
    query.setParameter("dateFinFormation",critereRecherche.getDateFinFormation(),TemporalType.DATE);
    }

    List<Formation> formations = query.getResultList();

    return formations;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM