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 ответа:
Из документации:
Свойства версии, идентификаторы и Ассоциации игнорируются. Около по умолчанию свойства с нулевым значением исключаются.
(Курсив мой)
Вам нужно будет использовать обычное ограничение критериев:
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();