我正在尝试从 Oracle 数据库检索时间戳日期,但代码抛出:
java.lang.IllegalArgumentException:投影类型必须是
界面!
我尝试使用本机查询,因为原始查询对于使用 Spring JPA 方法或 JPQL 来说太复杂了。
我的代码与下面的代码类似(抱歉,由于公司政策,无法粘贴原始代码)。
Entity:
@Getter
@Setter
@Entity(name = "USER")
public class User {
@Column(name = "USER_ID")
private Long userId;
@Column(name = "USER_NAME")
private String userName;
@Column(name = "CREATED_DATE")
private ZonedDateTime createdDate;
}
投影:
public interface UserProjection {
String getUserName();
ZonedDateTime getCreatedDate();
}
存储库:
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
@Query(
value = " select userName as userName," +
" createdDate as createdDate" +
" from user as u " +
" where u.userName = :name",
nativeQuery = true
)
Optional<UserProjection> findUserByName(@Param("name") String name);
}
我正在使用 Spring Boot 2.1.3 和 Hibernate 5.3.7。
我也遇到了同样的问题,有一个非常相似的投影:
public interface RunSummary {
String getName();
ZonedDateTime getDate();
Long getVolume();
}
我不知道为什么,但问题在于ZonedDateTime
。我切换了类型getDate()
to java.util.Date
,异常就消失了。在事务之外,我将日期转换回 ZonedDateTime 并且我的下游代码没有受到影响。
我不知道为什么这是一个问题;如果我不使用投影,ZonedDateTime 就可以开箱即用。我同时将其发布为答案,因为它应该能够作为解决方法。
根据this bug https://github.com/spring-projects/spring-data-commons/issues/2223在 Spring-Data-Commons 项目中,这是由于在投影中添加对可选字段的支持而导致的回归。 (显然,这实际上并不是由其他修复引起的——因为其他修复是在 2020 年添加的,并且这个问题/答案早在它之前。)无论如何,它已在 Spring-Boot 2.4.3 中标记为已解决。
基本上,您无法在投影中使用任何 Java 8 时间类,只能使用旧的基于日期的类。我上面发布的解决方法可以解决 2.4.3 之前的 Spring-Boot 版本中的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)