0

次のようなネイティブ 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 );
        }
    }

}

ここで日付をつなぐのを手伝ってくれませんか?助けてくれてありがとう!!

4

3 に答える 3

0

私は最終的に @ColumnTransformer(write="") を使用しましたが、非常に使いやすいだけでなく、非常にうまく機能します。

休止状態によって挿入または更新クエリが実行されるたびに、最終クエリに挿入される列の書き込み式を選択するのに役立ちます。

参照リンク: http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/mapping.html#mapping-column-read-and-write

于 2013-10-22T20:09:12.737 に答える