【问题标题】:unexpected token error while running PostgreSQL query in Java在 Java 中运行 PostgreSQL 查询时出现意外的令牌错误
【发布时间】:2019-12-03 20:11:01
【问题描述】:

我为 PostgreSQL 创建了以下查询,该查询在 SqlWorkbench 中运行良好。但是当我将它集成到 Java 代码中时,我得到了一个语法错误异常:

查询在 SqlWorkbench 中运行良好:

ELECT poaiF.fnsku, 
       poaiF.acknowledgement_type_code AS last_ack_code 
FROM   po_acknowledgement_items poaiF, 
       (SELECT Max(poa.po_acknowledgement_id) AS last_po_ack_id, 
               poai.fnsku 
        FROM   po_acknowledgement_items poai, 
               po_acknowledgements poa 
        WHERE  poa.po_acknowledgement_id = poai.po_acknowledgement_id 
               AND poa.order_id = '5D7P2FLB' 
        GROUP  BY poai.fnsku) t 
WHERE  t.last_po_ack_id = poaiF.po_acknowledgement_id 
       AND t.fnsku = poaiF.fnsku 

Java 中的查询(在 (SELECT Max(poa.po_acknowledgement_id) AS last_po_ack_id) 开头给出语法错误:

private static final String LAST_ACK_CODE_QUERY1 = "SELECT poaiF.fnsku, \n" +
        "       poaiF.acknowledgement_type_code AS last_ack_code \n" +
        "FROM   po_acknowledgement_items poaiF, \n" +
        "       (SELECT Max(poa.po_acknowledgement_id) AS last_po_ack_id, \n" +
        "               poai.fnsku \n" +
        "        FROM   po_acknowledgement_items poai, \n" +
        "               po_acknowledgements poa \n" +
        "        WHERE  poa.po_acknowledgement_id = poai.po_acknowledgement_id \n" +
        "               AND poa.order_id = \'5D7P2FLB\' \n" +
        "        GROUP  BY poai.fnsku) t \n" +
        "WHERE  t.last_po_ack_id = poaiF.po_acknowledgement_id \n" +
        "       AND t.fnsku = poaiF.fnsku";

通过集成测试运行查询时,出现以下错误:

unexpected token: ( 在第 4 行第 8 列附近,它是 (SELECT Max(poa.po_acknowledgement_id)

我正在运行org.springframework.orm.hibernate3.LocalSessionFactoryBean,如下所示。

SessionFactory postgresSessionFactory; //initialized with org.springframework.orm.hibernate3.LocalSessionFactoryBean class.


final Session session = postgresSessionFactory.getCurrentSession();

String query = LAST_ACK_CODE_QUERY;

final Query selectQuery = session.createQuery(query).setTimeout(queryTimeout);
final List<Object[]> terms = selectQuery.list();

请帮我解决这个问题。

【问题讨论】:

  • 您需要\' 的转义符吗?
  • 今日提示:始终使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接!

标签: java sql spring postgresql hibernate


【解决方案1】:

来自Hibernate 文档:

查询 createQuery(String queryString)
为给定的 HQL 查询字符串创建一个 Query 实例。

如果你想要一个 SQL 查询,你需要使用 createSQLQuery 来代替:

SQLQuery createSQLQuery(String queryString)
为给定的 SQL 查询字符串创建一个 SQLQuery 实例。

【讨论】:

  • SQLQuery 不工作。我可以使用 creatQuery 运行一个简单的查询。最初的问题是,实体映射不正确。我纠正了它,它运行成功。但现在我无法加入虚拟表。正如您在原始查询中看到的,我正在加入一个虚拟表,而 hibernate 在那里抱怨。
猜你喜欢
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多