简体   繁体   English

在冬眠中,如何处理查询参数为空或为空?

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

I'm using JPA, hibernate 3. 我正在使用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());

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(). 但是traceEntityVO.getLotNumber(),traceEntityVO.getMfrLocId(),traceEntityVO.getExpDate()的值可能为null或为空

In this case the value 'null' or '' is checked against the variable instead of is null condition. 在这种情况下,将针对变量而不是null条件来检查值'null'或''。 How do I handle when I'm not sure about the parameter value, either null or empty? 当我不确定参数值是否为null或为空时,该如何处理?

I don't want to construct the query dynamically based on the values if empty or null. 我不想基于空或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? 但是,使用条件API( hibernate )( JPA )来构建这样的查询很容易,您认为呢?

I hope following code will sort your problem. 我希望以下代码可以解决您的问题。 Assuming getMfrDate and getExpDate will return Date Object and others either Number or String objects. 假设getMfrDate和getExpDate将返回Date对象和其他Number或String对象。 But you can modify IsEmpty according to return types. 但是您可以根据返回类型修改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 ");
 }  

build your query according to your parameters (null or not) using the conditional statement if() like this example for the date: 使用条件语句if()根据您的参数(是否为空)构建查询,如日期示例所示:

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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