首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate类型框架在使用带有原生SQL的PostgreSQLIntervalType时抛出"PSQLException: ERROR: cannot cast type bigint to interval“。

Hibernate类型框架在使用带有原生SQL的PostgreSQLIntervalType时抛出"PSQLException: ERROR: cannot cast type bigint to interval“。
EN

Stack Overflow用户
提问于 2020-01-17 20:38:23
回答 3查看 552关注 0票数 1

我是Spring框架的初学者。

我使用hibernate-types将PostgreSQL间隔转换为Java Duration对象。

对于选择所有行,这种方法工作得很好。我已经为特定表创建了一个数据模型,并使用TypeDef注释进行映射:

代码语言:javascript
复制
@Entity
@Table(name = "test")
@Typedef(
    typeClass = PostgreSQLIntervalType.class,
    defaultForType = Duration.class
)
@Getter @Setter
public class Test {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private Duration flightDuration;
}

但是现在我想创建一个自定义的原生查询。我想从表Test中选择所有行,其中flightDuration是the服务的RequestParam。下面是一个基本示例(真正的查询要复杂得多,需要一些特殊的postgres函数):

代码语言:javascript
复制
public interface TestRepository extends JpaRepository<Test, int> {

    @Query( value = SELECT * FROM test t WHERE flight_duration = ?1 , nativeQuery = true )
    List<Test> findByFlightDuration(Duration flightDuration);

}

但这是我的问题所在。我不知道如何使用PostgreSQLIntervalType将持续时间转换为PostgreSQL间隔。

如果我像上面那样执行查询,我会得到以下错误:

代码语言:javascript
复制
org.postgresql.util.PSQLException: ERROR: cannot cast type bigint to interval

所以当我必须在测试类中设置一个像TypeCast这样的注释(或其他什么东西)时,持续时间会被转换成PostgreSQLIntervalType吗?

EN

回答 3

Stack Overflow用户

发布于 2020-01-17 20:40:50

没有理由使用原生查询。您可以简单地使用JPQL。

代码语言:javascript
复制
@Query( value = "FROM test t WHERE flight_duration = ?1")
List<Test> findByFlightDuration(Duration flightDuration);
票数 0
EN

Stack Overflow用户

发布于 2020-01-17 20:54:36

如果您真的需要nativeQery,那么必须将查询中的整数转换为PostgreSQL区间。

我假设您在查询中提供了秒数,而?1是您的飞行所需的秒数。

尝试以下操作:

代码语言:javascript
复制
@Query(value = SELECT * FROM test t WHERE flight_duration = (?1 || ' secs') , nativeQuery = true )
List<Test> findByFlightDuration(int flightDurationInSec);

更多信息请点击此处:https://www.postgresql.org/message-id/Pine.LNX.4.44.0410051443550.13144-100000@matrix.gatewaynet.com

但我建议你回顾一下你是否真的需要这个。也许您可以尝试使用JPQL。让我们知道。

票数 0
EN

Stack Overflow用户

发布于 2020-06-18 00:24:02

对于原生SQL查询,您需要使用特定于Hibernate的setParameter Query方法来提供处理自定义列类型所需的Hibernate类型:

代码语言:javascript
复制
List<Test> tests = entityManager.createNativeQuery("""
    SELECT * 
    FROM test t 
    WHERE flight_duration = :duration
    """, Test.class)
.unwrap(org.hibernate.query.Query.class)
.setParameter("duration", flightDuration, PostgreSQLIntervalType.INSTANCE)
.getResultList();

这样,Hibernate将知道如何处理duration查询参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59787514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档