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

SAP Hybris FlexibleSearch报错:VARCHAR转java.lang.Long类型不兼容问题排查

问题排查与解决方案

错误根源

错误提示incompatible data type in conversion: from SQL type VARCHAR to java.lang.Long, value: customer10,核心原因是FlexibleSearch查询返回的字段与你要映射的NewCustomerModel类型不匹配:
你在查询中只选择了{NAME}(字符串类型的客户名称),但却要求返回List<NewCustomerModel>实例。Hybris在尝试用单个字符串字段构建完整模型对象时,会错误地将该字符串值赋值给模型中某个Long类型的属性(比如主键PK或者CUSTID),从而触发类型转换异常。

修复方案

根据你的需求选择以下两种方式之一:

1. 需要完整的NewCustomerModel对象

修改查询语句,选择模型的主键{PK}或者所有字段{*},让Hybris能正确加载完整模型:

@Override
public List<NewCustomerModel> getCustomerNameFromID() {
    final StringBuilder query=new StringBuilder();
    // 选择主键,Hybris会根据主键加载完整模型
    query.append("SELECT {PK} FROM {" + NewCustomerModel._TYPECODE + "} WHERE {"+ NewCustomerModel.CUSTID + "}=1");
    final FlexibleSearchQuery flexQuery = new FlexibleSearchQuery(query);
    final SearchResult<NewCustomerModel> searchResult = flexibleSearchService.search(flexQuery);
    if (CollectionUtils.isNotEmpty(searchResult.getResult()))
    {
        return searchResult.getResult();
    }
    return Collections.EMPTY_LIST;
}

或者选择所有字段:

query.append("SELECT {*} FROM {" + NewCustomerModel._TYPECODE + "} WHERE {"+ NewCustomerModel.CUSTID + "}=1");

2. 仅需要客户名称字符串

如果只需要获取客户名称,无需完整模型,修改返回类型为List<String>,并指定查询结果类型:

@Override
public List<String> getCustomerNameFromID() {
    final StringBuilder query=new StringBuilder();
    query.append("SELECT {" + NewCustomerModel.NAME + "} FROM {" + NewCustomerModel._TYPECODE + "} WHERE {"+ NewCustomerModel.CUSTID + "}=1");
    final FlexibleSearchQuery flexQuery = new FlexibleSearchQuery(query);
    // 指定结果类型为String
    flexQuery.setResultClassList(Collections.singletonList(String.class));
    final SearchResult<String> searchResult = flexibleSearchService.search(flexQuery);
    if (CollectionUtils.isNotEmpty(searchResult.getResult()))
    {
        return searchResult.getResult();
    }
    return Collections.EMPTY_LIST;
}

额外排查建议

  1. 检查NewCustomerModel的属性定义:确认CUSTID的类型是否与查询条件匹配。如果CUSTID是String类型,查询条件应改为='1'(带单引号),避免数据库隐式类型转换出错。
  2. 开启查询详情日志:在local.properties中添加flexible.search.exception.show.query.details=true,这样后续报错会显示生成的SQL语句,更便于定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:15:53