Hibernate查询无法自动拆箱基本类型,如何解决?
问题解答
这确实是Hibernate处理JPQL构造函数查询时的行为限制——它默认会将数据库返回的数值类型映射为包装类,不会自动拆箱去匹配基本类型参数的构造器,所以才会提示找不到接受Short类型参数的构造方法。
可以通过以下两种方式解决,无需改用包装类型字段:
在JPQL中显式转换类型
使用CAST函数将查询结果中的version字段转换为对应基本类型的SQL类型,让Hibernate能匹配到基本类型参数的构造器。示例代码:TypedQuery<Issue> query = entityManager.createQuery( """ Select id, CAST(version AS smallint), occurence, description FROM issue """, Issue.class);注意:不同数据库的类型关键字可能有差异,比如MySQL用
smallint,Oracle可使用number(5),需对应数据库中与Javashort匹配的类型。新增适配包装类的构造器
在Issue类中新增一个接受Short类型参数的构造器,内部将其转换为short基本类型后调用原有构造器,同时保留原有基本类型构造器。示例:public Issue(UUID id, Short version, Instant occurrance, String description) { // 根据业务需求处理null情况,比如抛异常或设置默认值 if (version == null) { throw new IllegalArgumentException("version cannot be null"); } this(id, version.shortValue(), occurrance, description); }这种方式既满足Hibernate的类型匹配要求,又能保持原有字段的基本类型定义,避免引入不必要的null值。
内容的提问来源于stack exchange,提问作者Herr Derb
相关产品推荐
相关产品推荐

