java - 如何使用hibernate在HQL中使用子查询

标签 java hibernate jpa hql

我有一个使用 hibernate 和 jersey 框架的 Maven 项目, 我尝试使用 hql 创建子查询,但它不起作用, DAO 包上的代码如下:

...
    StringBuilder str = new StringBuilder();
    str.append(" SELECT t.produtos FROM Tabela t WHERE t.id = :tabelaId ");

    if(parametro != null) { 
        str.append(" AND :parametro like (SELECT p.nome FROM Produto p) ");
    }

    try {
        if(tabelaId != null ) {

            Query query = em.createQuery(str.toString());
            query.setParameter("tabelaId", tabelaId);

            if(parametro != null) {
                query.setParameter("parametro", "%" + parametro + "%");
            }

            produtos = query.setFirstResult(offset).setMaxResults(limit).getResultList();
        }else {
            throw new DAOException("Voce deve informar a tabela!", ErrorCode.BAD_REQUEST.getCode());
        }

    }
...

当我尝试执行查询时收到错误消息。

错误信息是:

<AST>:0:0: unexpected AST node: query
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1386)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:4316)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2134)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2062)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:813)
at

...

最佳答案

这句话:

AND :parametro like (SELECT p.nome FROM Produto p)

JPQL 或 HQL 不支持。支持子查询,但问题是带有子查询的 :parametro like

关于java - 如何使用hibernate在HQL中使用子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50335949/

相关文章:

java - 使用ajax v java 获取请求

java - 将多个 Jtextarea 添加到同一个 JScrollPane 中

java - JAX-RS 的双向字段值转换

java - 无法使用 jaxb 将 XML 持久保存到数据库

java - 具有依赖倒置的多对多关系

java - Shiro 路径模式排除

java - 具有两个多对一关系的实体关系

java - Spring JPA : findByEmail throwing NullPointerException if given email is not found

java - Hibernate - 在三列中,至少一列必须为非空

spring - javax.persistence.spi.PersistenceUnitInfo.getSharedCacheMode() Ljavax/persistence/SharedCacheMode;