我是Spring框架的初学者。
我使用hibernate-types将PostgreSQL间隔转换为Java Duration对象。
对于选择所有行,这种方法工作得很好。我已经为特定表创建了一个数据模型,并使用TypeDef注释进行映射:
@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函数):
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间隔。
如果我像上面那样执行查询,我会得到以下错误:
org.postgresql.util.PSQLException: ERROR: cannot cast type bigint to interval所以当我必须在测试类中设置一个像TypeCast这样的注释(或其他什么东西)时,持续时间会被转换成PostgreSQLIntervalType吗?
发布于 2020-01-17 20:40:50
没有理由使用原生查询。您可以简单地使用JPQL。
@Query( value = "FROM test t WHERE flight_duration = ?1")
List<Test> findByFlightDuration(Duration flightDuration);发布于 2020-01-17 20:54:36
如果您真的需要nativeQery,那么必须将查询中的整数转换为PostgreSQL区间。
我假设您在查询中提供了秒数,而?1是您的飞行所需的秒数。
尝试以下操作:
@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。让我们知道。
发布于 2020-06-18 00:24:02
对于原生SQL查询,您需要使用特定于Hibernate的setParameter Query方法来提供处理自定义列类型所需的Hibernate类型:
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查询参数。
https://stackoverflow.com/questions/59787514
复制相似问题