3

Я застрял с этим некоторое время и не могу добиться прогресса. Вопрос заключается в том, как использовать Hibernate's createCriteria, когда ограничительное поле в БД является FK.hibernate createCriteria на поле FK не работает для меня

Вот 2 таблицы: счета и * cf_account_type *, который представляет собой классификатор (клиент, сотрудник и т.д.)

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 документации предлагает расположено here и выглядит следующим образом:

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

Однако секс и цвет не OBJ ects, но текстовые поля. Таким образом, проблема в том, что мой код возвращает все строки из учетной записи и, похоже, не принимает во внимание ограничение.

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(); 

Дополнительная информация:

БД является PostgreSQL 9.1.2, и он соединен с помощью JDBC4 (PostgreSQL-9.1-902.jdbc4.jar)

Outtake от 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> 

ответ

3

От the documentation:

Version свойства, идентификаторы и as ассоциации игнорируются. По умолчанию default, свойства с нулевым значением исключены.

(курсив мой)

Вы должны будете использовать регулярные ограничения критериев:

session.createCriteria(Account.class, "account") 
     .add(Restrictions.eq("account.cfAccountType", cfAccountType) 
     .list(); 
2

Цитирование использование QBE от documentation:

Свойства, идентификаторы и ассоциации игнорируются. По умолчанию default, свойства с нулевым значением исключены.

Хотя, затем показан пример размещения критериев при связанных объектов:

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();