【发布时间】:2019-08-10 08:32:14
【问题描述】:
我正在尝试从 oracle 数据库中检索时间戳日期,但代码正在抛出:
java.lang.IllegalArgumentException:投影类型必须是 界面!
我正在尝试使用本机查询,因为原始查询对于使用 Spring JPA 方法或 JPQL 来说过于复杂。
我的代码与下面的代码类似(抱歉,由于公司政策,无法粘贴原始代码)。
实体:
@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。
【问题讨论】:
-
我已经检查了您推荐的帖子,但在那篇文章中,他使用 Spring JPA 方法遇到了问题。如果我的代码可以正常使用(也可以使用 JPQL)。只有当我使用本机查询时它才会失败。就像以前 Spring Data JPA 不支持 Java 8 日期,我们必须手动创建转换器一样。
-
我也有这个问题。如果我从投影中删除 ZonedDateTime 它就起作用了。不过,我还没有弄清楚如何让它与日期/时间字段一起使用。
-
@RoddyoftheFrozenPeas 当查询返回的值与投影中使用的 Java 类型不匹配时,我遇到了这个问题。
标签: java spring hibernate spring-boot spring-data-jpa