如何使用 JPA QueryBuilder 提供自定义表达式或谓词
How to provide custom Expression or Predicate with JPA QueryBuilder
我正在将 JPA2(EclipseLink 实现)与 Spring 数据一起使用,并使用规范模式来提供过滤器规范。
如何引入将映射到自定义 SQL 运算符的自定义表达式或谓词?我特别想到使用 PostgreSQL FTS 扩展并添加如下条件:
SELECT ... WHERE ... AND column @@ 'ts query'
到我的规范实例。
有几种方法可以做到这一点:
- 如果切换到 Hibernate 是一种选择,那么有一种方法可以使用 Hibernate 基础结构来实现:
For HQL in Hibernate
http://java-talks.blogspot.co.uk/2014/04/use-postgresql-full-text-search-with-hql.html
And for integrating Hibernate implementation with JPQL
http://metabroadcast.com/blog/hibernate-and-postgres-fts
Basically, what you need to do is
- Override your PostgreSQL Dialect
- Register functions with appropriate interpreters
- Call functions, when you need to use FTS
- 如果您不能使用 Hibernate,您仍然可以做到,基本上使用与上述相同的方法,但使用 EclipseLink 细节
这里是 link 如何使用 EclipseLink https://wiki.eclipse.org/Introduction_to_EclipseLink_Expressions_%28ELUG%29
基本上你需要做同样的工作人员,但 EclipseLink 风格
根据文档,它可能看起来像这样:
public class MyDatabasePlatform extends DatabasePlatform {
final private int FTS_ID = Interger.MAX_VALUE;
protected void initializePlatformOperators() {
super.initializePlatformOperators();
// Create user-defined function
ExpressionOperator fts = new ExpressionOperator();
fts.setSelector(FTS_ID);
List args = new ArrayList();
args.addElement(" @@ to_tsquery(");
args.addElement(")");
fts.printAs(args);
fts.bePrefix();
fts.setNodeClass(FunctionExpression.class);
// Make it available to this platform only
ExpressionOperator.registerOperator(FTS_ID, "fts");
addOperator(fts);
}
}
尽管我不确定该代码,但您需要对其进行测试。
我正在将 JPA2(EclipseLink 实现)与 Spring 数据一起使用,并使用规范模式来提供过滤器规范。
如何引入将映射到自定义 SQL 运算符的自定义表达式或谓词?我特别想到使用 PostgreSQL FTS 扩展并添加如下条件:
SELECT ... WHERE ... AND column @@ 'ts query'
到我的规范实例。
有几种方法可以做到这一点:
- 如果切换到 Hibernate 是一种选择,那么有一种方法可以使用 Hibernate 基础结构来实现:
For HQL in Hibernate
http://java-talks.blogspot.co.uk/2014/04/use-postgresql-full-text-search-with-hql.html
And for integrating Hibernate implementation with JPQL
http://metabroadcast.com/blog/hibernate-and-postgres-fts
Basically, what you need to do is
- Override your PostgreSQL Dialect
- Register functions with appropriate interpreters
- Call functions, when you need to use FTS
- 如果您不能使用 Hibernate,您仍然可以做到,基本上使用与上述相同的方法,但使用 EclipseLink 细节
这里是 link 如何使用 EclipseLink https://wiki.eclipse.org/Introduction_to_EclipseLink_Expressions_%28ELUG%29
基本上你需要做同样的工作人员,但 EclipseLink 风格
根据文档,它可能看起来像这样:
public class MyDatabasePlatform extends DatabasePlatform {
final private int FTS_ID = Interger.MAX_VALUE;
protected void initializePlatformOperators() {
super.initializePlatformOperators();
// Create user-defined function
ExpressionOperator fts = new ExpressionOperator();
fts.setSelector(FTS_ID);
List args = new ArrayList();
args.addElement(" @@ to_tsquery(");
args.addElement(")");
fts.printAs(args);
fts.bePrefix();
fts.setNodeClass(FunctionExpression.class);
// Make it available to this platform only
ExpressionOperator.registerOperator(FTS_ID, "fts");
addOperator(fts);
}
}
尽管我不确定该代码,但您需要对其进行测试。