【问题标题】:Hibernate HQL issue expecting IDENT found "*"发现 IDENT 的 Hibernate HQL 问题“*”
【发布时间】:2013-10-31 11:40:11
【问题描述】:

我需要从相关表中获取所有数据,所以我使用这样的东西(我会在 sql 中使用它)

    private static final String SELECT_OOPR_TO_SEND = "SELECT R.* " +
                                                      "FROM offerOrderProjectRel R, offerOrder O, project P " +
                                                      "WHERE P.id = R.project_id and O.id = R.offer_order_id " +
                                                      "and O.type = 'ORDER' and (P.status = 'PENDING' or P.status ='PROTECTED')" ;
; 
    

    @SuppressWarnings("unchecked")
    public List<OfferOrderProjectRel> findAllOfferOrderToSendToSalesmans() {
        Query q = getSession().createQuery(SELECT_OOPR_TO_SEND);
        List<OfferOrderProjectRel> list = q.list();
        return list;
    }

启动此代码后,我收到了该错误:

org.hibernate.hql.internal.ast.QuerySyntaxException:期待 IDENT, 在第 1 行第 10 列附近找到“**”[SELECT R.* FROM offerOrderProjectRel R, offerOrder O, 项目 P WHERE P.id = R.project_id 和 O.id = R.offer_order_id 和 O.type = 'ORDER' 和 (P.status = 'PENDING' 或 P.status ='PROTECTED')]

那么如何通过休眠获取列 R 中的所有数据?

【问题讨论】:

  • 您是否尝试过仅使用 R 而不是 R.*?
  • 将查询编辑为“从 R 中选择”。省略 R.* 这是 HQL 语法。
  • HQL 与实体、字段和关联一起工作。永远不要使用表格和列。它与 SQL 不同。如果是,它将被命名为 SQL。阅读 Hibernate 文档。
  • 谢谢你们,是的,我必须阅读文档,我的错。谢谢!

标签: java sql hibernate


【解决方案1】:

createQuery 方法需要一个 HQL 查询字符串。

HQL 是object-oriented querying language

HQL 将SELECT R.* 解释为选择对象R 的成员字段*

但是* 不是R 的成员字段。是吗?..

要选择R 的所有成员字段,请使用:

SELECT R
FROM offerOrderProjectRel R, offerOrder O, project P
WHERE P.id = R.project_id and O.id = R.offer_order_id
and O.type = 'ORDER' and (P.status = 'PENDING' or P.status ='PROTECTED')

【讨论】:

    【解决方案2】:

    你使用的是 SQL 查询,而不是 hql 查询,所以应该是

    Query q = getSession().createSQLQuery(SELECT_OOPR_TO_SEND);
    

    【讨论】:

    • 当我使用EntityManager时,如何使用getSession()?
    • 你不使用 getSession()。你需要 SessionFactory 而不是 EntityManager
    【解决方案3】:

    对于在使用org.springframework.data.jpa.repository.Query 时收到“期望 IDENT 发现“*””错误并发现此问题的人,我将补充一点,您可以将 nativeQuery 标志更改为 true

    @Query(value = "SELECT * FROM table1", nativeQuery = true)
    List<Object> myFindAll();
    

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      相关资源
      最近更新 更多