3

私はしばらくこれに固執していて、進歩することができません。問題は、DBの制限フィールドがFKである場合にHibernateのcreateCriteriaをどのように使用するかです。

次に、アカウントと、修飾子(クライアント、従業員など)を表す*cf_account_type*の2つのテーブルを示します。

    CREATE TABLE account (
        usern character varying(30) NOT NULL,
        cf_account_type character varying(30) NOT NULL
    );
    ALTER TABLE ONLY account
        ADD CONSTRAINT pk_account366 PRIMARY KEY (usern);

    CREATE TABLE cf_account_type (
        cf_account_type character varying(30) NOT NULL
    );
    ALTER TABLE ONLY cf_account_type
        ADD CONSTRAINT pk_cf_account_type373 PRIMARY KEY (cf_account_type);

    ALTER TABLE ONLY account
        ADD CONSTRAINT fk_account465 FOREIGN KEY (cf_account_type) 
        REFERENCES cf_account_type(cf_account_type);

Hibernateのドキュメントが示唆するソリューションは ここにあり、次のようになります。

    Cat cat = new Cat();
    cat.setSex('F');
    cat.setColor(Color.BLACK);
    List results = session.createCriteria(Cat.class)
        .add( Example.create(cat) )
        .list();

ただし、性別はオブジェクトではなく、プレーンテキストフィールドです。したがって、問題は、私のコードがアカウントからすべての行を元に戻し、制限を考慮していないように見えることです

    Session session = SF.getSession();
    Transaction tx = session.beginTransaction();
    //creating an example instance
    Account instance = new Account();
    instance.setCfAccountType(cfAccountType);

    //fetching from db
    List<Account> result = (List<Account>)session.
            createCriteria(Account.class).
                    add(Example.create(instance)).list();
    tx.commit();

追加情報:

DBはPostgreSQL9.1.2であり、JDBC4(postgresql-9.1-902.jdbc4.jar)を介して接続されています。

hibernate.cfg.xmlファイルからのアウトテイク

    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.password">CENSORED</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/CENSORED</property>
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQL82Dialect</property>

    <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.search.autoregister_listeners">false</property>
    <property name="hibernate.connection.autocommit">true</property>
    <property name="hibernate.show_sql">false</property>

    <property name="hibernate.hbm2ddl.auto">update</property>
4

2 に答える 2

3

ドキュメントから:

バージョンのプロパティ、識別子、および関連付けは無視されます。デフォルトでは、null値のプロパティは除外されます。

(強調鉱山)

通常の基準制限を使用する必要があります。

session.createCriteria(Account.class, "account")
       .add(Restrictions.eq("account.cfAccountType", cfAccountType)
       .list();
于 2012-06-18T14:05:36.657 に答える
2

ドキュメントからQBEの使用法を引用:

バージョンのプロパティ、識別子、および関連付けは無視されます。デフォルトでは、null値のプロパティは除外されます。

ただし、次に、関連するオブジェクトに基準を配置する例を示します。

List results = session.createCriteria(Cat.class)
    .add( Example.create(cat) )
    .createCriteria("mate")
        .add( Example.create( cat.getMate() ) )
    .list();

あなたのケースにそれを適用してください:

List<Account> result = (List<Account>) session.createCriteria(Account.class)
                .add(Example.create(instance))
                .createCriteria("ofAccountType")
                     .add(Example.create(instance.getOfAccountType()))
                     .list();
于 2012-06-18T14:01:20.320 に答える