gpt4 book ai didi

java - 如何使用 JPA 调用需要常量参数的 SQL native 函数?

转载 作者:行者123 更新时间:2023-12-01 17:58:41 27 4
gpt4 key购买 nike

我尝试获取如下所示的查询:

select count(*) from somewhere group by DATEDIFF(week, '2010-01-01', creation_date);

我的问题出在函数调用上。我正在使用 JPA 的 CriteriaBuilder (cb) 和 Hibernate(根目录是我的某处):

cb.function("DATEDIFF", Integer.class, cb.literal("week"), cb.literal('2010-01-01'), root.<Date>get("creationDate")

生成的 SQL 是:

select count(*) from somewhere group by DATEDIFF(?, ?, creation_date);
- param1: 'week'
- param2: '2010-01-01'

这不起作用,因为第一个函数参数应该是常量而不是“?”。

我怎样才能像这样注入(inject)这个常量参数(没有引号,不作为参数)?

谢谢

在这种情况下我的对象是这样的:

@Entity
public class Somewhere {
@Id
private Long id;

@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;

// Getters and setters
}

最佳答案

根据基督徒的评论,解决方案实际上很容易实现。

Sql Server 方言,具有新函数“weekdiff”:

import org.hibernate.dialect.SQLServerDialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StandardBasicTypes;

public class ExtendedSqlServerDialect extends SQLServerDialect {

public ExtendedSqlServerDialect() {
registerFunction("weekdiff", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "datediff(week, ?2, ?1)"));
}
}

然后,只需要求 Hibernate 使用此方言(我使用的是 spring boot)。

application.yml:

spring.jpa.properties.hibernate.dialect: com.xxx.dialect.ExtendedSqlServerDialect

以及我使用它的代码示例:

CriteriaBuilder cb /* = ... */;
CriteriaQuery<Tuple> query = cb.createTupleQuery();
Root<Upload> root = query.from(Somewhere.class);
query.groupBy(cb.function("weekdiff",
Integer.class,
root.get("creationDate"),
cb.parameter(String.class, "refDate")).alias("week")
);

因为我在单元测试中使用 HSQLDB,所以这里对应 HSQLDB 方言:

import org.hibernate.dialect.SQLServerDialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StandardBasicTypes;

public class ExtendedHsqlDialect extends SQLServerDialect {

public ExtendedHsqlDialect() {
registerFunction("weekdiff", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "truncate(datediff('day', ?2, ?1) / 7)"));
}
}

不幸的是,我无法在 Group By 子句中使用此函数(请参阅 Why ORDER BY DATEDIFF raise an exception on SQL server using JPA? )

关于java - 如何使用 JPA 调用需要常量参数的 SQL native 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42585326/

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