【问题标题】:Hibernate dynamic parameters queryHibernate动态参数查询
【发布时间】:2013-10-22 22:23:54
【问题描述】:

我有一个查询需要使用“动态”参数集。 但是不知道该怎么做,我试图不添加 where 字符串,但它给了我错误,因为设置了参数。

有什么建议吗?

String queryS = "select object(c) from "
                           + entityClassName + " as c " +
                            "where 1 = 1" ;

            if(codigoPaciente.compareTo("") != 0)
            {
                queryS += " and c.CodigoDoPaciente =:paciente";
            }
            if(codServicoPrincipal.compareTo("") != 0)
                queryS += " and c.codigoServicoPrincipal =:servico";
            if(data != null)
                queryS += " and c.codigoServicoPrincipal =:data";
            if(TipoServico.compareTo("") != 0)
                queryS += " and c.codigoServicoPrincipal =:tipoServico";


            Query query = em.createQuery(queryS);
            query.setParameter("paciente", codigoPaciente);
            query.setParameter("codigoServicoPrincipal", codServicoPrincipal);
            query.setParameter("data", data);
            query.setParameter("tipoServico", TipoServico);


            return query.getResultList();

【问题讨论】:

    标签: java hibernate hsqldb


    【解决方案1】:

    criteria API 可以用于以更“安全”的方式构造查询,而不是执行一堆字符串连接来创建查询。然后您可以在单个条件检查中添加条件和值。

    【讨论】:

    • 我同意乔尔的观点。
    • 我只部分同意自己的观点。使用标准 api 并不愉快。
    • 这可能会很痛苦,但从长远来看,避免连接东西通常会有所回报......
    • 我试图避免使用标准 API ......但它似乎是唯一的方法
    • 参见 QueryDSL。强类型的动态查询,没有标准 API 的痛苦。 blog.mysema.com/2010/04/querydsl-as-alternative-to-jpa-2.html
    【解决方案2】:

    您没有在 if 条件中设置参数...也许为您连接的每个字符串设置参数?

    if(codigoPaciente.compareTo("") != 0)
                {
                    queryS += " and c.CodigoDoPaciente =:paciente";
                }
    
    Query query = em.createQuery(queryS);
    
    // etc etc...
    if(codigoPaciente.compareTo("") != 0)
        query.setParameter("paciente", codigoPaciente);
    

    【讨论】:

    • 还有一点;如果您删除 WHERE 子句并继续连接 AND 而不检查是否已连接某些条件,您将有一个以 AND 开头的条件。这当然会给你一个错误。
    • 无法在构建查询的 IF 上设置参数,因为对象“QUERY”尚不存在
    • if 显然是在你创建了查询对象之后使用的。
    • 这个解决方案违反了 DRY -- 我们如何同时定义查询和设置参数。
    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2018-01-22
    • 1970-01-01
    相关资源
    最近更新 更多