使用 QueryDSL 调用 Postgres 函数

Calling Postgres function using QueryDSL

我的 Postgres 数据库上安装了一个具有相似功能的包。我在 JDBC 上使用纯 SQL 给他们打电话,它按预期工作。

现在我正在尝试重构我的代码以使用 QueryDSL。相似性函数的第一步是在 0 和 1 之间设置一个限制,以便只返回高于给定阈值的结果。我正在尝试这种方式:

NumberExpression<Float> sim = Expressions.numberTemplate(Float.class, "set_limit({0})", "0.2"); query.singleResult(sim);

我收到以下错误: java.lang.IllegalArgumentException: No joins given

我知道我还没有通过 EntityPath。如果我尝试使用任何 EntityPath,我会收到错误消息:

`[[IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode
 \-[METHOD_CALL] MethodNode: '('
    +-[METHOD_NAME] IdentNode: 'set_limit' {originalText=set_limit}
    \-[EXPR_LIST] SqlNode: 'exprList'
       \-[NAMED_PARAM] ParameterNode: '?' {name=1, expectedType=null}
]]`

在那之后,我会调用另一个数据库函数,但我想解决方案是一样的。

这可以用 QueryDSL 实现吗?

set_limit 不是有效的 JPQL,这就是 Hibernate 抛出异常的原因。 Querydsl JPA 在内部映射到 JPQL,Querydsl SQL 映射到 SQL。

如果您需要 SQL 表现力,就像在这种情况下,您将需要使用 Querydsl SQL。