Java 是否可以避免添加“=”“真的”;对于“中的布尔函数”;其中;HQL查询的子句

Java 是否可以避免添加“=”“真的”;对于“中的布尔函数”;其中;HQL查询的子句,java,hibernate,jpa,Java,Hibernate,Jpa,我正在使用PostgreSQL和JPA/Hibernate。 我需要构建一个HQL查询,其中包含PostgreSQL正则表达式比较运算符(name~'pattern')。 我有以下方言: public class PostgreSQLExtendedDialect extends PostgreSQL95Dialect { public PostgreSQLExtendedDialect() { registerFunction("regexp_matches", ne

我正在使用PostgreSQL和JPA/Hibernate。 我需要构建一个HQL查询,其中包含PostgreSQL正则表达式比较运算符(
name~'pattern'
)。 我有以下方言:

public class PostgreSQLExtendedDialect extends PostgreSQL95Dialect {

    public PostgreSQLExtendedDialect() {
        registerFunction("regexp_matches", new SQLFunctionTemplate(BooleanType.INSTANCE, "(?1 ~ ?2)"));
    }

}
但是,下面的查询

entityManager.createQuery("select p from Person p where regexp_matches(p.name, ?1)")
        .setParameter(1, "qwe")
        .getResultList();
entityManager.createQuery("select p from Person p where regexp_matches(p.name, ?1) = true")
        .setParameter(1, "qwe")
        .getResultList();
。。。失败,出现以下异常:

antlr.NoViableAltException: unexpected AST node: (
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2146)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:815)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:609)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:313)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:261)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:271)
同时,以下查询

entityManager.createQuery("select p from Person p where regexp_matches(p.name, ?1)")
        .setParameter(1, "qwe")
        .getResultList();
entityManager.createQuery("select p from Person p where regexp_matches(p.name, ?1) = true")
        .setParameter(1, "qwe")
        .getResultList();
。。。工作正常,但会产生以下奇怪的SQL:

where
    person0_.name ~ ?=true
我想知道是否有可能避免向已经是布尔表达式的HQL部分添加奇怪的“=true”后缀。理想情况下,可能有一些只注册操作符的功能,这样我就可以直接在HQL中编写“p.name~?1”

注意。我知道我可以编写本机查询,但我有相当复杂的HQL查询,在SQL版本中它将是一个巨大的巨人,所以我需要保留HQL


谢谢

这是不可能的。Mabye在Hibernate 6中,但之前没有办法这样做,因为函数总是要生成标量值,如果需要谓词,则需要使用JPQL/HQL谓词

您可以引入一个定制的
SQLFunction
实现,该实现将HQL函数调用
regexp_匹配(p.name,?1)
呈现为
regexp_匹配(p.name,?1)和true=
,这样在使用
regexp_匹配(p.name,?1)时,整个生成的查询将是
regexp_匹配(p.name,?1)和true=true
=真

PostgreSQL可以优化同义反复
true=true