Java 更新到3.6.5后,Hibernate映射到SQL公式的属性失败
我刚从3.3.0.GA更新到Hibernate 3.6.5.Final,在对XML映射属性调用SQL公式时遇到问题:Java 更新到3.6.5后,Hibernate映射到SQL公式的属性失败,java,mysql,hibernate,Java,Mysql,Hibernate,我刚从3.3.0.GA更新到Hibernate 3.6.5.Final,在对XML映射属性调用SQL公式时遇到问题: <property name="endDate" type="java.util.Date" formula="TIMESTAMPADD(SECOND, (quantity*60*60), transactionDate)" /> 问题很明显,this.SECOND应该是SECOND。在我看来,Hibernate将TIMESTAMPADD识
<property
name="endDate"
type="java.util.Date"
formula="TIMESTAMPADD(SECOND, (quantity*60*60), transactionDate)"
/>
问题很明显,this.SECOND
应该是SECOND
。在我看来,Hibernate将TIMESTAMPADD
识别为一个公式,而不是将SECOND
识别为一个静态传递参数,因此认为它必须是表中的一列。我不确定如何告诉hibernate它应该按原样使用SECOND
我在我的方言中尝试了registerFunction
和registerKeyword
,但没有成功,因为它们似乎与HQL函数定义有关,而不是公式中使用的本机SQL
有谁能告诉我正确的方向,或者告诉我Hibernate在这些版本之间有什么不同,以及我如何解决它吗?我在Sql Server中遇到了相同类型的问题-类似的解决方案可能会奏效 这是我发现的。 所以,试着把引号放在第二位
<property
name="endDate"
type="java.util.Date"
formula="TIMESTAMPADD("SECOND", (quantity*60*60), transactionDate)"
/>
实际上,我不确定如何在这个xml属性中避免双引号,但我会先尝试
“
”,如果这不起作用\”
,我刚刚升级到Hibernate 4.1.2,同样的问题又出现了。[SECOND]的解决方案不再有效,我不得不用自己的自定义方言注册关键字。比如:
public class ExtendedMySQL5InnoDBDialect extends MySQL5InnoDBDialect {
public ExtendedMySQL5InnoDBDialect() {
super();
//make sure to register it in lowercase as uppercase does not work (took me 4 hours to realize)
registerKeyword("second");
}
}
MySQL 5.0拒绝此查询:
selecttimestampadd(“second”,60,current_date())=>您的SQL语法在“second”附近有错误…
。我相信Hibernate会删除引号。也许MSSQL更灵活:)我想你让我走上了正确的轨道。我尝试了双引号和单引号,但都不起作用。但是[本文][1]建议使用[SECOND]
。由于另一个项目的一些截止日期,我将在明天返回我的hibernate更新分支,并让您知道它是否有效。[1]:
public class ExtendedMySQL5InnoDBDialect extends MySQL5InnoDBDialect {
public ExtendedMySQL5InnoDBDialect() {
super();
//make sure to register it in lowercase as uppercase does not work (took me 4 hours to realize)
registerKeyword("second");
}
}