【问题标题】:MSSQL Invalid Syntax with Hibernate when using DISTINCT?使用 DISTINCT 时 MSSQL 的 Hibernate 语法无效?
【发布时间】:2016-05-05 12:14:47
【问题描述】:

所以我有这段Java代码:

final Query query = session.createSQLQuery("SELECT DISTINCT(expense_document.id) FROM expense_document JOIN generic_object ON expense_document.id = generic_object.id JOIN expense_document_item ON expense_document_item.document_id = expense_document.id JOIN generic_object ON expense_document_item.id = generic_object.id WHERE expense_document.client_id = :client_id").setParameter("client_id", client.getId()).setMaxResults(1000);

当执行此代码时,我得到:

org.hibernate.exception.SQLGrammarException: could not execute query
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'from'.

我找不到 MS SQL 不喜欢这个查询的地方。当我连接到 MySQL 时,这条线不会造成任何问题。

【问题讨论】:

  • 查询对我来说很好。你确定这是查询吗?

标签: java sql-server hibernate


【解决方案1】:

您的查询看起来不错..您使用的是最新的 MSSQL 驱动程序吗?

有关受支持的 SQL 服务器驱动程序,请参阅 how to configure hibernate config file for sql server

你应该可以做到:

final Query query = session.createSQLQuery("SELECT DISTINCT(expense_document.id) FROM expense_document JOIN generic_object ON expense_document.id = generic_object.id JOIN expense_document_item ON expense_document_item.document_id = expense_document.id JOIN generic_object ON expense_document_item.id = generic_object.id WHERE expense_document.client_id = :client_id").setParameter("client_id", client.getId()).setMaxResults(1000);

final Query query = session.createSQLQuery("SELECT DISTINCT expense_document.id FROM expense_document JOIN generic_object ON expense_document.id = generic_object.id JOIN expense_document_item ON expense_document_item.document_id = expense_document.id JOIN generic_object ON expense_document_item.id = generic_object.id WHERE expense_document.client_id = :client_id").setParameter("client_id", client.getId()).setMaxResults(1000);

但是,如果您使用的是 hibernate,为什么不使用 HQL、JPA 查询语言或 Criteria?这应该确保您不必根据供应商更改 SQL 语法,因为它们在不同的风格中略有不同。如果您在不同的数据库之间切换,我觉得将 JPA 与实体管理器一起使用可能是前进的方向,因为 createSqlQuery 会将字符串作为本机 SQL 发送给供应商。

Hibernate EntityManager 实现了编程接口和 JPA 2.0 规范定义的生命周期规则 https://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html_single/

如果您使用的是 hibernate 之类的东西,那么 createSqlQuery 非常适合在您想设置提示时发送特定于供应商的查询。

【讨论】:

    【解决方案2】:

    尝试删除 distinct 关键字参数周围的括号。

    像这样使用它:

    select distinct something from somewhere
    

    【讨论】:

    • 在使用 Squirrel 对 SQLServer 进行测试时,它实际上与括号一起工作。但是,如果您说删除它们可以解决您的问题,我会保留答案。
    • 另一个答案中所说的关于驱动程序的事情可能是一些事情,每当我从 sqlserver 收到一个奇怪的错误时,它总是由于 sqljdbc 驱动程序。改用 jtds..
    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多