1

データ型 ANYDATA の 1 つの列を含む (他のいくつかの列の中で) Oracle テーブルへの単純な Groovy & Grails インターフェイスを作成しようとしています。(私はG&Gに不慣れなので、ご容赦ください。)

ドメイン クラスを使用すると、列を sqltype "sys.anydata" に簡単にマップできますが、コントローラーはこれを処理できないようです。典型的なエラーが発生します: ORA-00932: inconsistent datatypes: expected CHAR got CHAR

Oracle の anydata 列を扱うのは難しい場合があるので、これは驚くことではありません。

まず、挿入を成功させるために文字列を ANYDATA に変換するには、コントローラーの保存メソッドをオーバーライドする必要があると思います。ここからどこから始めればよいかわかりません...通常、Oracle SQLでは次のようなものを使用します。

mytable (id, anydatacol) 値 (1, sys.anyData.convertVarchar2('mystring')) に INSERT

INSERT SQL で、anydata に挿入された文字列を取得します。

既定の保存メソッドの代わりに、上記のように (フィールドでいくつかの関数を使用して) 挿入するようにコントローラーをカスタマイズするにはどうすればよいですか?

grails と anydata の実例を見たいのですが、grails で anydata をどこまで使用できるかに関係なく、上記のようなコントローラーをカスタマイズする方法に興味があります。



とても参考になりそうです、ありがとうございます!

いくつかの進歩を遂げています。すべてがコンパイルされますが、run-app を実行すると次のようになります。

Running Grails application
| Error 2013-10-17 22:33:29,123 [startStop-1] ERROR hbm2ddl.SchemaUpdate  - could not complete schema update
Message: No Dialect mapping for JDBC type: 2002
    Line | Method
->>  262 | run       in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    724 | run       in java.lang.Thread
| Server running. Browse to

私のデータベースはOracle 11gです。方言org.hibernate.dialect.Oracle10gDialectを使用しています... 11も試してみましたが、同じエラーがスローされます。

カスタムユーザータイプを使用するために必要な他の設定はありますか? あなたが投稿したリンクから、クラスを作成しました。それに加えて、私のクラスは次のようになります。

class Anytest {

    String name
    AnyScalarData anytdat

    static mapping = {
        table 'ANYTDAT'
        anytdat type:AnyScalarData, sqltype: "sys.anydata"

    }


    static constraints = {
        name(blank:false)
        anytdat(nullable:true)
    }
}

編集:

Config.groovy を次のように更新しました。

grails.gorm.default.mapping = { 'ユーザータイプ'( type:AnyScalarDataUserType, class:AnyScalarData )}

しかし、今取得:

Running Grails application
| Error 2013-10-17 23:01:27,441 [localhost-startStop-1] ERROR context.GrailsContextLoader  - Error initializing the application: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.codehaus.groovy.grails.exceptions.GrailsDomainException: Error evaluating ORM mappings block for domain [anydata_01.Anytest]:  No such property: AnyScalarDataUserType for class: org.codehaus.groovy.grails.orm.hibernate.cfg.HibernateMappingBuilder
Message: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.codehaus.groovy.grails.exceptions.GrailsDomainException: Error evaluating ORM mappings block for domain [anydata_01.Anytest]:  No such property: AnyScalarDataUserType for class: org.codehaus.groovy.grails.orm.hibernate.cfg.HibernateMappingBuilder
    Line | Method
->>  262 | run       in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    724 | run       in java.lang.Thread
Caused by BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.codehaus.groovy.grails.exceptions.GrailsDomainException: Error evaluating ORM mappings block for domain [anydata_01.Anytest]:  No such property: AnyScalarDataUserType for class: org.codehaus.groovy.grails.orm.hibernate.cfg.HibernateMappingBuilder
->>  262 | run       in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
4

1 に答える 1

0

DomainClass の使用: カスタム UserType の作成

Grails は内部で Hibernate を使用します。Oracle の のマッピング タイプを検索しましたが見つかりませんでした。そのため、カスタムの User TypeANYDATAを実装する必要があります。基本的に、データベースから列をソートして取得する方法を Hibernate に変換します。

これは、ANYDATA で動作する UserType で見つけた例です。

SQL の使用

Grails は初めてなので、ドメイン クラスを使用せずに SQL を直接使用することもできることに注意してください。サービス例:

class MyService {
  def dataSource

  void addNewRecord(String data) {
    groovy.sql.Sql sql = new Sql(dataSource)
    sql.execute("insert into my_table(my_anydata_clomn) values(sys.anyData.convertVarchar2(?))",[data])
  }

}
于 2013-10-17T19:04:51.177 に答える