diff --git a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java index 7d1b7b75ec9..3f1c7ec2938 100644 --- a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java +++ b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java @@ -56,6 +56,7 @@ import javax.persistence.Enumerated; import javax.persistence.Table; import javax.persistence.TableGenerator; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.cloud.utils.DateUtil; @@ -878,7 +879,7 @@ public abstract class GenericDaoBase extends Compone for (final Field field : clazz.getDeclaredFields()) { sql.append(_table).append(".").append(DbUtil.getColumnName(field, overrides)).append(" = ? AND "); } - sql.delete(sql.length() - 4, sql.length()); + removeAndClause(sql); } return sql.toString(); @@ -1262,10 +1263,11 @@ public abstract class GenericDaoBase extends Compone @DB() protected void addJoins(StringBuilder str, Collection>> joins) { + boolean hasWhereClause = true; int fromIndex = str.lastIndexOf("WHERE"); if (fromIndex == -1) { fromIndex = str.length(); - str.append(" WHERE "); + hasWhereClause = false; } else { str.append(" AND "); } @@ -1287,13 +1289,19 @@ public abstract class GenericDaoBase extends Compone .append(" "); str.insert(fromIndex, onClause); String whereClause = join.getT().getWhereClause(); - if ((whereClause != null) && !"".equals(whereClause)) { + if (StringUtils.isNotEmpty(whereClause)) { + if (!hasWhereClause) { + str.append(" WHERE "); + hasWhereClause = true; + } str.append(" (").append(whereClause).append(") AND"); } fromIndex += onClause.length(); } - str.delete(str.length() - 4, str.length()); + if (hasWhereClause) { + removeAndClause(str); + } for (JoinBuilder> join : joins) { if (join.getT().getJoins() != null) { @@ -1302,6 +1310,10 @@ public abstract class GenericDaoBase extends Compone } } + private void removeAndClause(StringBuilder sql) { + sql.delete(sql.length() - 4, sql.length()); + } + @Override @DB() public List search(final SearchCriteria sc, final Filter filter) {