如何使用 JPA QueryBuilder 提供自定义表达式或谓词

How to provide custom Expression or Predicate with JPA QueryBuilder

我正在将 JPA2(EclipseLink 实现)与 Spring 数据一起使用,并使用规范模式来提供过滤器规范。

如何引入将映射到自定义 SQL 运算符的自定义表达式或谓词?我特别想到使用 PostgreSQL FTS 扩展并添加如下条件:

SELECT ... WHERE ... AND column @@ 'ts query'   

到我的规范实例。

有几种方法可以做到这一点:

  1. 如果切换到 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
  1. 如果您不能使用 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);
   }

}

尽管我不确定该代码,但您需要对其进行测试。