我有一个 javax.persistence.Query 类型的对象,其中有一个本机 PL/SQL 查询(对于 Oracle),例如:
BEGIN
merge into account t
using dual
ON (t.account_id = '1')
WHEN MATCHED THEN
update set name=?, updated_date=? where account_id=?
WHEN NOT MATCHED THEN
insert (name, account_id, created_date) values (?, ?, ?);
COMMIT;
END;
我还有一个位置参数列表,如下所示:'some-name', '01/01/2013 00:00:00', '1'
问题是我想用 sysdate 替换 updated_date/created_date 的参数,以便我最终的 go-to-DB 查询如下所示:
BEGIN
merge into account t
using dual
ON (t.account_id = '1')
WHEN MATCHED THEN
update set name=?, updated_date=sysdate where account_id=?
WHEN NOT MATCHED THEN
insert (name, account_id, created_date) values (?, sysdate, ?);
COMMIT;
END;
但是,如果我将位置参数之一指定为“sysdate”,那么 Hibernate 会将其作为字符串直接使用,并且会出现错误。如何告诉 Hibernate 我要指定关键字 sysdate 而不是字符串 'sysdate' ?
由于某种原因,我们无法使用触发器或 JVM 日期(为简单起见,省略了详细信息)
// Martin 回复后更新
嗨马丁,谢谢你的回答。
我看到了您建议的代码,但无法从中做出任何事情。很可能有一些我遗漏的小部分,如果你能帮助我,那就太好了。我只会发布相关的代码部分来展示我所看到的。
public class PostgresUUIDType extends AbstractSingleColumnStandardBasicType<UUID>
{
public static final PostgresUUIDType INSTANCE = new PostgresUUIDType();
public PostgresUUIDType() {
super( PostgresUUIDSqlTypeDescriptor.INSTANCE, UUIDTypeDescriptor.INSTANCE );
}
}
// which calls
public AbstractSingleColumnStandardBasicType(SqlTypeDescriptor sqlTypeDescriptor, JavaTypeDescriptor<T> javaTypeDescriptor) {
super( sqlTypeDescriptor, javaTypeDescriptor );
}
// which calls
public AbstractStandardBasicType(SqlTypeDescriptor sqlTypeDescriptor, JavaTypeDescriptor<T> javaTypeDescriptor) {
this.sqlTypeDescriptor = sqlTypeDescriptor;
this.javaTypeDescriptor = javaTypeDescriptor;
}
// And the BasicTypeRegistry looks like this:
class BasicTypeRegistry {
public BasicTypeRegistry() {
register( BooleanType.INSTANCE );
register( NumericBooleanType.INSTANCE );
register( TrueFalseType.INSTANCE );
...
}
void register(BasicType type) {
for ( String key : type.getRegistrationKeys() ) {
final Type old = registry.put( key, type );
}
}
}
你能帮我把这里的日期联系起来吗?非常感谢你的帮助!!