Java 重构:为具有多个可选参数的查询清除dao代码
有没有可能清理这种dao方法? 我不喜欢每个参数都有2个if,但是没有类似于“query.setSql()”的东西,所以我可以在添加参数并构建sql之后更新sqlJava 重构:为具有多个可选参数的查询清除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
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();
}