0

我正在尝试使用大量 if-else、null 检查语句重写 HQL 中的查询。而且我不理解编写这些语句的逻辑。发布一些代码片段。

这里的问题是任何 NotBlank 检查都失败了,它会导致格式错误的查询,例如

“org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:AND 附近的第 1 行,第 149 列 [SELECT a.visit.id FROM com.test.Visit a LEFT JOIN a.location l LEFT JOIN a.provider p WHERE AND l.id IN (?) AND a.checkedIn = ? AND p.id IN (?) " 需要知道如何处理这样的逻辑。

StringBuilder whereClause = new StringBuilder();
String condition = obj.methodA() ? "AND" : "OR";

StringBuilder queryBuilder = new StringBuilder("SELECT a.visit.id FROM ").append(Visit.class.getName()).append(" a");

if (StringUtils.isNotBlank(obj.getStartDate())) {
  CriteriaUtils.addBasicCriteria("a.time >= ?", whereClause, getTimeRangeStart(obj), args);
}
if (StringUtils.isNotBlank(obj.getEndDate())) {
  CriteriaUtils.addBasicCriteria(" AND a.time < ?", whereClause, getTimeRangeEnd(obj), args);
}

if (Utils.isNotNullArray(obj.getLocationIds())) {
  queryBuilder.append(" LEFT JOIN a.location l");
  whereClause.append(CriteriaUtils.getInListClause(" AND l.id IN ", args, obj.getLocationIds()));
}
if (BooleanUtils.isTrue(obj.getRequiredChecked())) {
  CriteriaUtils.addBasicCriteria(" AND a.checkedIn = ?", whereClause, true, args);
}
queryBuilder.append(" LEFT JOIN a.provider p");

if (Utils.isNotNullArray(obj.getProviderIds())) {
  whereClause.append(CriteriaUtils.getInListClause(" AND p.id IN ", args, obj.getProviderIds()));
}
}

假设所有的函数调用都是正确的。所有数据都被正确调用。

4

0 回答 0