次のようなネイティブ PL/SQL クエリ (Oracle 用) がある javax.persistence.Query 型のオブジェクトがあります。
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'
問題は、updated_date/created_date のパラメーターを sysdate に置き換えて、最終的な 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;
しかし、位置パラメータの 1 つを 'sysdate' として指定すると、Hibernate によって文字通り文字列として取得され、エラーが発生します。文字列 'sysdate' ではなく、キーワード sysdate を指定したいことを Hibernate に伝えるにはどうすればよいですか?
何らかの理由で、トリガーまたは 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 );
}
}
}
ここで日付をつなぐのを手伝ってくれませんか?助けてくれてありがとう!!