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

时间:2017-05-31 12:53:53

标签: java postgresql hibernate jpa querydsl

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

我创建了一个GraphQL架构,其中包含25个最受欢迎的列作为可查询字段。我想添加一个通用的“字段”输入类型,它包含一个名称(db列名+“_”+操作(如gte,gt,contains等)和一个值(用户搜索的值)对)。

因此,当用户(在GraphiQL中)输入类似(field:{name:“age_gt”,value:“50”})作为GraphQL查询的搜索输入时,我可以提出:“age> 50" 。

一切正常,但是当创建谓词并将其添加到整个查询(booleanBuilder.and(new Predicate))时,我无法弄清楚如何创建一个仅包含原始SQL字符串的谓词(“年龄> 50”)。

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

思考 PredicateOperation()可能是答案,但同样,没有文档,我在网上找不到任何例子。

我很抱歉没有发布代码,我所有的东西都在不同网络的防火墙后面,所以我的网络机器没有剪切​​和粘贴。

1 个答案:

答案 0 :(得分:0)

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

Expressions.numberTemplate("FUNCTION('SUM', {0}), x) 

然而,age > 50 作为表达式也可能是有效的 JPQL,所以可以这样写:

Expressions.numberTemplate("SUM(age)")

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