【问题标题】:Unable to execute a SP via a namedQuery declared in *.hbm.xml file无法通过 *.hbm.xml 文件中声明的 namedQuery 执行 SP
【发布时间】:2016-07-21 02:54:10
【问题描述】:

我正在尝试使用 POC 在 MS SQL Server 2012 上的 Hibernate 中使用 namedQueries,并在我的 Reminder.hbm.xml 配置中配置了以下内容。

<hibernate-mapping>
    <class name="com.reminder.hibernate.model.Reminder" table="Reminders">
    ...
    ...
    </class>

    <sql-query name="fetchDOBsBasedOnDate">
        <return alias="reminder" class="com.reminder.hibernate.model.Reminder"/>
        <![CDATA[EXEC FetchDOBsBasedOnDate(:birthDate)]]>
    </sql-query>

</hibernate-mapping>

我正在尝试从 Java 类中调用上述命名查询,如下所示:

Query query = session.getNamedQuery("fetchDOBsBasedOnDate").setDate("birthDate", new Date(new java.util.Date().getTime()));
//Used java.sql.Date above

以下是我在存储过程中放入的单个 SQL 语句,因为我无法运行查询本身,这是存储过程的代码。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE FetchDOBsBasedOnDate 
@InputDate DATETIME
AS
BEGIN
    SET NOCOUNT ON;
    SELECT * FROM Reminders WHERE DATEADD(year, DATEDIFF(year, BirthDate, @InputDate), BirthDate) = @InputDate
END
GO

问题是,我通过 Hibernate 执行此 SP 时遇到错误,因为 SP 完全正常工作。我在控制台上看到的错误:

Hibernate: EXEC FetchDOBsBasedOnDate(?)
1 Apr, 2016 3:48:14 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 102, SQLState: S0001
1 Apr, 2016 3:48:14 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Incorrect syntax near '@P0'.

编辑: 去掉括号后,SQL语法错误被抑制了,但我仍然没有得到结果。

【问题讨论】:

    标签: java sql-server hibernate stored-procedures


    【解决方案1】:

    don't want parentheses around your stored procedure parameter list。试试:

    <![CDATA[EXEC FetchDOBsBasedOnDate :birthDate]]>
    

    不要忘记,您始终可以从 SQL Server Management Studio 等独立客户端尝试您的 SQL,看看它是否有效。

    此外,您似乎正在使用带有时间组件的日期(我不太了解您正在使用的类,但如果那是 java.util.Date,它也会以毫秒精度存储时间。 ) 您能否打印 Java 代码中的参数值以准确查看您正在查询的内容,或者打开任何类型的查询日志记录?我有一种感觉,您可能正在寻找生日在一天中精确到毫秒的时间点的人,这可能不会在您的数据库中找到。

    【讨论】:

    • 您的建议帮助我抑制了 SQL 语法错误,但我仍然无法使用 Hibernate 执行存储过程... :(
    • 您应该更改您的问题以反映您当前的问题,包括错误消息、您如何知道它不起作用等。
    • 我已经在独立客户端上测试了我的存储过程,它运行良好,但是当我尝试通过 Hibernate 调用时没有给出结果。!
    • @BPavanKumar 你确定你使用的是相同的参数吗?我对 Java 了解不多,但看起来好像您正在使用带有时间组件的日期 - 您的数据库中是否真的有人出​​生在确切的日期和时间(可能包括分钟和秒)您的查询?
    • 感谢您的指点,完全错过了 - 将在 Matt 上工作!
    猜你喜欢
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2016-08-23
    相关资源
    最近更新 更多