Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重构:为具有多个可选参数的查询清除dao代码_Java_Sql_Refactoring - Fatal编程技术网

Java 重构:为具有多个可选参数的查询清除dao代码

Java 重构:为具有多个可选参数的查询清除dao代码,java,sql,refactoring,Java,Sql,Refactoring,有没有可能清理这种dao方法? 我不喜欢每个参数都有2个if,但是没有类似于“query.setSql()”的东西,所以我可以在添加参数并构建sql之后更新sql public List<OriginLabel> findByCriteria(Link1 l1, Link2 l2, String att) { String sql = "FROM MyEntity e WHERE 1=1"; if(l1 != null){ sql += " AND e

有没有可能清理这种dao方法? 我不喜欢每个参数都有2个if,但是没有类似于“query.setSql()”的东西,所以我可以在添加参数并构建sql之后更新sql

public List<OriginLabel> findByCriteria(Link1 l1, Link2 l2, String att) {
    String sql = "FROM MyEntity e WHERE 1=1";
    if(l1 != null){
        sql += " AND e.link1 = :l1 ";
    }
    if(l2 != null){
        sql += " AND e.link2 = :l2 ";
    }
    if(att != null){
        sql += " AND e.attribute = :att ";
    }
    Query query = getEntityManager().createQuery(sql);
    if(l1 != null){
        query.setParameter("l1", l1);
    }
    if(l2 != null){
        query.setParameter("l2", l2);
    }
    if(att != null){
        query.setParameter("att", att);
    }
    return (List<MyEntity>)query.getResultList();
}
公共列表findByCriteria(link1l1、link2l2、字符串att){
String sql=“FROM MyEntity e,其中1=1”;
如果(l1!=null){
sql+=“和e.link1=:l1”;
}
如果(l2!=null){
sql+=“和e.link2=:l2”;
}
如果(att!=null){
sql+=“和e.attribute=:att”;
}
Query Query=getEntityManager().createQuery(sql);
如果(l1!=null){
query.setParameter(“l1”,l1);
}
如果(l2!=null){
query.setParameter(“l2”,l2);
}
如果(att!=null){
query.setParameter(“att”,att);
}
return(List)query.getResultList();
}

我建议调查一下


您可以创建访问每个参数(变为可访问)的访问者,并在这样做时将条件添加到查询字符串中。

如果出现以下情况,我会将参数存储在哈希映射中:

public List<OriginLabel> findByCriteria(Link1 l1, Link2 l2, String att) {
    String sql = "FROM MyEntity e WHERE 1=1";
    HashMap parameters = new HashMap();
    if(l1 != null){
        sql += " AND e.link1 = :l1 ";
        parameters.put("l1", l1);
    }
    if(l2 != null){
        sql += " AND e.link2 = :l2 ";
        parameters.put("l2", l2);
    }
    if(att != null){
        sql += " AND e.attribute = :att ";
        parameters.put("att", l1);
    }
    Query query = getEntityManager().createQuery(sql);
    SQLUtility.setParameters(query, parameters);
公共列表findByCriteria(link1l1、link2l2、字符串att){
String sql=“FROM MyEntity e,其中1=1”;
HashMap参数=新的HashMap();
如果(l1!=null){
sql+=“和e.link1=:l1”;
参数。输入(“l1”,l1);
}
如果(l2!=null){
sql+=“和e.link2=:l2”;
参数。put(“l2”,l2);
}
如果(att!=null){
sql+=“和e.attribute=:att”;
参数。输入(“att”,l1);
}
Query Query=getEntityManager().createQuery(sql);
setParameters(查询,参数);
SQLUtility.setParameters
(易于实现,自己编写)在
HashMap
键上循环,并在
查询上设置参数

也许QueryDSL是可以用来改进SQL相关代码的工具

使用QueryDSL时,每个参数只使用一个if来生成语句(并且您的语句将以静态类型生成,没有任何字符串技巧):

公共列表findByCriteria(link1l1、link2l2、字符串att){
QOriginLabel e=QOriginLabel.originLabel;
JPAQuery query=newjpaquery(em).from(e);
如果(l1!=null){
其中(e.link1.eq(l1));
}
如果(l2!=null){
其中(e.link2.eq(l2));
}
如果(att!=null){
其中(e.attribute.eq(att));
} 
返回查询列表(e);
}

如果性能不是问题,我喜欢这样编码:

public List<OriginLabel> findByCriteria(Link1 l1, Link2 l2, String att) { 
    String sql = "FROM MyEntity e " +
            "   WHERE e.link1 = isnull(:l1, e.link1) " +
            "       AND e.link2 = isnull(:l2, e.link2)" +
            "       AND e.attribute = isnull(:att, e.attribute)"; 
    Query query = getEntityManager().createQuery(sql); 
    query.setParameter("l1", l1); 
    query.setParameter("l2", l2); 
    query.setParameter("att", att); 
    return (List<MyEntity>)query.getResultList(); 
} 
公共列表findByCriteria(link1l1,link2l2,字符串att){
String sql=“来自MyEntity e”+
其中e.link1=isnull(:l1,e.link1)+
而e.link2=isnull(:l2,e.link2)+
“和e.attribute=isnull(:att,e.attribute)”;
Query Query=getEntityManager().createQuery(sql);
query.setParameter(“l1”,l1);
query.setParameter(“l2”,l2);
query.setParameter(“att”,att);
return(List)query.getResultList();
} 

是一种方法,但前提是条件为(x!=null)。不,我不同意。(或者我不明白你的意思)。例如,如果l1的值为null,where子句将变为“where e.link1=isnull(null,e.link1)'的计算结果为'e.link1=e.link1',始终为真。如果l1不为null,则计算结果为'where e.link1=:l1'。Thx,我不想引入一个新框架,只是为了这么小的清理。但很高兴知道,如果我需要创建更复杂的动态查询,它可能会有所帮助。
public List<OriginLabel> findByCriteria(Link1 l1, Link2 l2, String att) { 
    String sql = "FROM MyEntity e " +
            "   WHERE e.link1 = isnull(:l1, e.link1) " +
            "       AND e.link2 = isnull(:l2, e.link2)" +
            "       AND e.attribute = isnull(:att, e.attribute)"; 
    Query query = getEntityManager().createQuery(sql); 
    query.setParameter("l1", l1); 
    query.setParameter("l2", l2); 
    query.setParameter("att", att); 
    return (List<MyEntity>)query.getResultList(); 
}