【发布时间】:2013-09-27 23:34:29
【问题描述】:
我有一个 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;
我还有一个位置参数列表,如下所示: '一些名字','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 );
}
}
}
你能帮我把这里的日期联系起来吗? 非常感谢您的帮助!!
【问题讨论】:
-
创建另一个类似的查询,其中 sysdate 是硬编码的,并调用此查询。
标签: java sql oracle hibernate orm