JPA2 Criteria API 中 Hibernate 的 Restrictions.sqlRestriction 的等价物?

问题描述 投票:0回答:2

是否有相当于 Hibernate 的 Restrictions.sqlRestriction 的 JPA2 Criteria API?

另外,如果没有等效的,我很想知道是否可以“破解”Hibernate JPA2 支持中的某些内容以在查询中插入我自己的 SQL 片段。

hibernate jpa jpa-2.0 criteria-api
2个回答
0
投票

JPA2 中没有这样的选项(至少我知道)。您不能将 Criteria API 与本机 SQL(或与此相关的 JPAQL)混合使用。在 JPA2 中最接近的事情是进行本机 SQL 查询,并声明响应应编组到哪个实体类,从而使您能够有效地发出详细的 SQL 请求,但仍然可以从 ORM 功能中受益:

http://www.java2s.com/Code/Java/JPA/UsingNamedNativeQuery.htm


0
投票

我终于找到了一种使用 JPA 函数来做到这一点的方法。这是 hibernate 6 特有的,用于获取要渲染的不带括号的函数的 SQL。在这种情况下,原生 SQL 需要返回 ID 列表。

    public Expression createIdListFunction( CriteriaBuilder cb, String nativeQuery )
    {
            Expression exp = cb.function( nativeQuery, Long.class );
            SelfRenderingSqmFunction sexp = (SelfRenderingSqmFunction) exp;
            SqmFunctionDescriptor sdesc = sexp.getFunctionDescriptor();
            FieldUtils.setProtectedFieldValue( "useParenthesesWhenNoArgs", sdesc, false );
            return exp;
    }

    CriteriaBuilder cb = getCurrentSession( ).getCriteriaBuilder( );
            CriteriaQuery<Login> criteriaQuery = cb.createQuery( Login.class );
            Root<Login> root = criteriaQuery.from( Login.class );
            List<Predicate> expressions = new ArrayList<>( );
            expressions.add( root.get( "id" ).in( this.createIdListFunction( cb, "SELECT id FROM LOGIN" ) ) );
            criteriaQuery.select( root ).where( expressions.toArray( new Predicate[ 0 ] ) );
© www.soinside.com 2019 - 2024. All rights reserved.