gpt4 book ai didi

hibernate - 如何在 jpa native 查询中转换 joda DateTime

转载 作者:行者123 更新时间:2023-12-04 12:54:46 24 4
gpt4 key购买 nike

我有一个带有 hibernate 状态的 DateTime 属性的实体

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@Column(name = "EFF_DT")
protected DateTime effDt;

这一切都很好,适用于常规的 spring-data-jpa 生成的查询。

我正在尝试添加自定义 native 查询
 @Query(value = "SELECT COUNT(*) FROM wsa_circuit_state_history ch WHERE ch.eff_dt between ?1 and ?2", nativeQuery = true)
Integer countEffDateBetween(DateTime start, DateTime end);

我得到的错误是尝试调用它时
 java.sql.SQLException: ORA-00932: inconsistent datatypes: expected DATE got BINARY

这与我在将自定义类型映射添加到我的实体之前使用常规 Spring 数据查找器遇到的错误相同
 @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")

如何让 spring-data-jpa/hibernate 使用自定义类型映射将参数映射到 native 查询?

最佳答案

正是我也有同样的要求。我通过将自定义类型注册到 hibernate 配置来解决它。

对于原生查询,TypeDefs 不足以让 hibernate 找到用户类型。它需要类型解析器来找到它的类型。

@Query(value = "SELECT COUNT(*) FROM wsa_circuit_state_history ch WHERE ch.eff_dt between ?1 and ?2", nativeQuery = true)
Integer countEffDateBetween(DateTime start, DateTime end);

在这种情况下,hibernate 尝试从类型解析器猜测类型(org.joda.time.DateTime)。
Type type = session.getFactory().getTypeResolver().heuristicType(typename);

由于没有 DateTime 的解析器。然后它正在获取默认类型(可序列化类型)。并且 DateTime 的值被转换为其类型,即序列化并持久化在 DB 中,由于大二进制值而失败。

要解决此问题,您需要将 DateTime 类型注册到 Hibernate Configuration 作为
configuration.registerTypeOverride(new org.jadira.usertype.dateandtime.joda.PersistentDateTime(), new String[]{"org.joda.time.DateTime"});

关于hibernate - 如何在 jpa native 查询中转换 joda DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19128163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com