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

标签 spring postgresql jpa full-text-search eclipselink

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

如何引入将映射到自定义 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 细节

  • 这是使用 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);
       }
    
    }
    
    尽管我不确定该代码,但您需要对此进行测试。

    关于spring - 如何使用 JPA QueryBuilder 提供自定义表达式或谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28672756/

    相关文章:

    java - 合并的 JPA 异常

    java - 是否可以使用JAVA从文本文件读取文件结构并跟踪父节点和子节点?

    java - 如何正确查询多个嵌套数组中的字符串匹配项? - MongoDB

    postgresql - fatal error 锁文件 "postmaster.pid"已经存在

    sql - 如何进行 Sequelize 查询以获取一年中日期范围不可知的项目?

    spring - 配置Spring Boot+Hibernate+PostgreSQL

    java - 反序列化 Web 服务中的空列表

    java spring框架代码不运行

    java - java中sql查询的正确格式

    java - 我可以仅使用 id 创建 OneToOne 关系吗?