You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blaze Persistence 1.6.14使用ORDER BY时出现重复列SQL语法异常求助

解决方案:Blaze Persistence生成重复ORDER BY项导致SQL Server报错

问题根源

Blaze Persistence 1.6.14版本在处理含NULL值的字段排序时存在bug:当通过EntityViewSetting.addAttributeSorter()添加排序规则时,会重复生成用于处理NULL排序的CASE语句,最终导致SQL Server因ORDER BY列表存在重复项抛出SqlGrammarException。

可行解决方案

方案1:升级Blaze Persistence版本

将Blaze Persistence升级到1.6.15及以上版本,该版本已修复了NULL排序时重复生成CASE语句的问题,升级后原代码无需修改即可正常运行。

方案2:手动构建排序条件(临时规避)

如果暂时无法升级版本,可绕过EntityViewSetting的排序设置,直接在CriteriaBuilder上手动添加排序逻辑,避免重复的CASE语句生成:

@Override
public List<CurrencyView> findAllCurrencies(CurrencyCriteria currencyCriteria, Sort sort) {
    var settings = EntityViewSetting.create(CurrencyView.class);
    var cb = criteriaBuilderFactory.create(entityManager, Currency.class);

    // 直接在CriteriaBuilder上定义排序规则
    for (Sort.Order order : sort) {
        String property = order.getProperty();
        if (order.getDirection() == Sort.Direction.ASC) {
            cb.orderByAsc()
              .nullsLast() // 控制NULL值排序位置,按需改为nullsFirst()
              .from(Currency.class, "c")
              .get(property);
        } else {
            cb.orderByDesc()
              .nullsLast()
              .from(Currency.class, "c")
              .get(property);
        }
    }

    return entityViewManager.applySetting(settings, cb).getResultList();
}

通过nullsLast()/nullsFirst()方法可以直接指定NULL值的排序优先级,Blaze Persistence会生成简洁且唯一的排序语句,不会出现重复项。

内容的提问来源于stack exchange,提问作者skorpyo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:22:45