无法通过*.hbm.xml文件中声明的namedQuery执行SP



我正在尝试一个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语法错误被抑制了,但我仍然没有得到结果。

您不希望在存储过程参数列表周围使用括号。尝试:

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

别忘了,您总是可以从SQL Server Management Studio这样的独立客户端试用SQL,看看它是否有效。

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