hibernate createCriteria на поле FK не работает для меня


Я застрял с этим на некоторое время и не могу добиться прогресса. Вопрос в том, как использовать createCriteria Hibernate, Когда ограничительным полем в DB является FK.

Вот 2 таблицы: account и * 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 вот и выглядит так:

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

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

БД является PostgreSQL 9.1.2 и подключается через JDBC4 (postgresql-9.1-902.jdbc4.jar)

Выход из спячки.контекстно-свободная грамматика.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>
2 3

2 ответа:

Из документации:

Свойства версии

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

(Курсив мой)

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

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

Цитирование использования QBE из документации:

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

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

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