Flexible Search查询DAO返回空结果HAC正常,需适配多国家站点
问题分析与解决方案
核心问题排查
- 参数绑定错误:原代码中使用
qar.addQueryParameter(params)传递参数集合是错误的,该方法用于添加单个参数而非整个参数Map,导致查询的时间条件未生效,这是代码返回0结果但HAC执行正常的核心原因。 - 异常日志无效:原异常日志的格式化字符串缺少占位符,无法记录具体错误信息,不利于问题排查。
- 查询语句可读性差:原查询语句排版混乱,参数命名易引发混淆。
多站点适配说明
当前从BaseSiteModel的UID中提取后缀的逻辑(如从uk-site提取uk)是可行的,只需确保所有站点的ProductAvailabilityGroup和UserPriceGroup遵循统一命名规则:
- 可用性组:
[小写站点后缀]-availability(如fi-availability) - 价格组:
[大写站点后缀] Price Group(如FI Price Group)
修复后的完整代码
public List<ProductModel> getProductsByDateTimeRange(Date fromModifiedDate, Date toModifiedDate, BaseSiteModel site) { List<ProductModel> result = Collections.emptyList(); try { // 提取站点后缀,适配多站点规则 String siteSuffix = site.getUid().split("-", 2)[1]; String upperSiteSuffix = siteSuffix.toUpperCase(); // 构建格式化的Flexible Search查询语句 String query = "SELECT {" + ProductModel.PK + "} FROM {" + ProductModel._TYPECODE + " AS prod " + "JOIN CatalogVersion AS cv ON {cv:pk} = {prod:catalogVersion} " + "JOIN Catalog AS cat ON {cv:catalog} = {cat:pk} " + "JOIN ArticleApprovalStatus AS st ON {prod:approvalstatus} = {st:pk} " + "JOIN ProductAvailabilityAssignment AS paa ON {paa:product} = {prod:pk} " + "JOIN ProductAvailabilityGroup AS pag ON {paa:availabilityGroup} = {pag:pk} " + "JOIN PriceRow AS pricerow ON {pricerow:product} = {prod:pk} " + "JOIN UserPriceGroup AS upg ON {pricerow:ug} = {upg:pk} " + "} WHERE {prod:" + ProductModel.MODIFIEDTIME + "} >= ?fromModifiedDate " + "AND {cat:name} = 'ResMed Product Catalog' " + "AND {cv:version} = 'Online' " + "AND {st:code} = 'approved' " + "AND {pag:id} = '" + siteSuffix + "-availability' " + "AND {upg:name} = '" + upperSiteSuffix + " Price Group'"; FlexibleSearchQuery flexibleSearchQuery = new FlexibleSearchQuery(query); // 正确绑定查询参数 Map<String, Object> params = new HashMap<>(); params.put("fromModifiedDate", fromModifiedDate); flexibleSearchQuery.setQueryParameters(params); // 执行查询并返回结果 SearchResult<ProductModel> searchResult = flexibleSearchService.search(flexibleSearchQuery); result = searchResult.getResult(); // 日志输出查询到的产品信息 for (ProductModel product : result) { LOG.info("Product Code: {}, Modified Time: {}", product.getCode(), product.getModifiedtime()); } } catch (Exception e) { // 修复日志格式,记录完整错误信息 LOG.error("Exception in flexible search query: {}", e.getMessage(), e); } return result; }
关键修改点
- 参数传递修复:将错误的
qar.addQueryParameter(params)替换为flexibleSearchQuery.setQueryParameters(params),确保时间参数正确生效。 - 日志优化:修正异常日志的格式化逻辑,添加占位符并传入异常对象,便于定位问题。
- 代码健壮性提升:初始化返回结果为空列表,避免返回
null引发空指针异常。 - 可读性优化:调整查询语句的换行格式,提升代码维护性。
内容的提问来源于stack exchange,提问作者Swathi
相关产品推荐
相关产品推荐

