是否可以使用原始SQL的字符串创建QueryDSL谓词?

Pau*_*ulG 5 java postgresql hibernate jpa querydsl

我有一个Java,GraphQL,Hibernate,PostgreSQL,QueryDSL应用程序,该应用程序查询具有超过275列的超大型PostgreSQL表。

我创建了一个GraphQL模式,其中25个最流行的列是可查询字段。我想添加一个通用的“字段”输入类型,该输入类型包括名称(数据库列名称+“ _” +操作(如gte,gt,contains等)和值(用户正在搜索的值)对于)。

因此,当用户(在GraphiQL中)为GraphQL查询输入类似(字段:{name:“ age_gt”,值:“ 50”})的内容时,我可以得出:“ age> 50”。

一切正常,但是当需要创建谓词并将其添加到整个查询(booleanBuilder.and(new Predicate))时,我不知道如何创建仅包含原始SQL字符串的谓词(“ age > 50“)。

我使用绑定到Hibernate的实体POJO和jpa生成的“ Q”对象,以“正确”的方式创建了多个谓词。但是我需要能够添加一个或多个只是SQL字符串的谓词。我什至不确定是否存在该功能,QueryDSL Predicates的文档不存在。

以为 PredicateOperation()可能是答案,但是同样,没有文档,也找不到在线示例。

我为不发布代码而道歉,我所有的东西都在另一个网络的防火墙后面,因此不会剪切和粘贴到我的互联网机器上。

Jan*_*ing 0

在 Hibernate 中,可以使用自定义函数或 -function FUNCTION(在 JPA 2.1 中引入)注入任意 SQL。在 QueryDSL 中,可以通过TemplateExpressions 注入任意 JPQL/HQL。结合起来你得到:

Expressions.numberTemplate("FUNCTION('SUM', {0}), x) 
Run Code Online (Sandbox Code Playgroud)

然而,age > 50由于表达式也可能是有效的 JPQL,因此可以这样写:

Expressions.numberTemplate("SUM(age)")
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,最好创建一个遍历 GraphQL 查询并在 QueryDSL 中创建正确表达式的访问者,因为这TemplateExpressions很容易发生 SQL 注入。