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
相关产品推荐
相关产品推荐

