HSEARCH400655错误:投影字段基数无效问题求助
问题分析与解决方案
错误根源
Doctor类中doctorEspecialties是多值集合(List<DoctorEspecialty>),但默认的@ObjectProjection未声明该投影为多值类型,导致Hibernate Search处理嵌套的especialtyCode.id投影时,无法匹配多值上下文的 cardinality 要求,触发HSEARCH400655错误。
解决方案1:修正@ObjectProjection的multi属性
在Doctor类的doctorEspecialties字段上,显式设置@ObjectProjection的multi=true,明确告知Hibernate Search这是一个多值对象投影:
public record Doctor( UUID id, String fullName, @ObjectProjection(includeDepth = 2) DoctorDetails doctorDetails, @ObjectProjection(includeDepth = 1, multi = true) List<DoctorEspecialty> doctorEspecialties // 医生与专科的多对多关联 ){}
该修改直接匹配错误提示中要求的.multi()声明,让Hibernate Search正确处理集合内每个DoctorEspecialty对象的嵌套投影,解决 cardinality 不匹配问题。
解决方案2:手动构建投影(灵活性更高)
若自动映射仍有问题,可改用Hibernate Search投影API手动定义结构,明确标记多值集合,同时复用现有record类避免冗余:
List<Doctor> doctors = searchSession .search(Doctor.class) .select(f -> f.composite( f.field("id", UUID.class), f.field("fullName", String.class), f.object("doctorDetails").as(DoctorDetails.class), f.object("doctorEspecialties").multi().as(DoctorEspecialty.class) )) .where((f, root) -> { root.add(f.matchAll()); // 动态条件 }) .fetchHits(pageable.getPageNumber() * pageable.getPageSize(), pageable.getPageSize());
额外注意事项
- 检查
DoctorEspecialty中的doctor字段:由于Doctor与DoctorEspecialty存在双向引用,@ObjectProjection(includeDepth = 1)会投影Doctor的基础字段,若无需该关联数据,可移除字段或设置includeDepth=0避免不必要的嵌套。 - 确保所有嵌套投影的record(
DoctorEspecialty、Especialty)都已添加@ProjectionConstructor注解,Hibernate Search才能自动识别投影结构。
内容的提问来源于stack exchange,提问作者Another Good Guy
相关产品推荐
相关产品推荐

