Критерии создания Hibernate для объединения в одну и ту же таблицу дважды - пробовал 2 подхода с ошибкой 2 разностей - PullRequest
0 голосов
/ 28 февраля 2019

Я хотел бы создать критерии создания для следующего собственного sql.

К сожалению, я дважды сталкиваюсь с ошибкой дублирующегося связанного пути при использовании createCriteria.Когда я пытаюсь использовать Restrictions.sqlRestriction.Он не может предоставить требуемый SQL.

Попытка 1: создание критериев - двойной путь связывания

 Criteria criteria = getSession().createCriteria( Company.class );
                 criteria.createAlias( "customerCategories", "c1" );
                 criteria.add( Restrictions.in( "c1.customerCategory.customerCategoryId",
                         company.getBaseCustomerCategoryId() ) );
                 criteria.createAlias( "customerCategories", "c2" );
                 criteria.add( Restrictions.in( "c2.customerCategory.customerCategoryId",
                         company.getPromoCustomerCategoryId() ) );

Попытка 2: создание ограничения SQL - ORA-00920: недопустимый реляционный оператор из-за «где»

  Criteria criteria = getSession().createCriteria( Company.class );
                 criteria.add( Restrictions.sqlRestriction(
                         "INNER JOIN Company_Customercategory a on {alias}.companyId = a.companyId and a.CUSTOMERCATEGORYID = ?",
                         company.getBaseCustomerCategoryId(), LongType.INSTANCE ) );
                 criteria.add( Restrictions.sqlRestriction( 
                         "1=1 INNER JOIN Company_Customercategory b on {alias}.companyId = b.companyId
 and b.CUSTOMERCATEGORYID = ?", 
                         company.getPromoCustomerCategoryId(), LongType.INSTANCE) );

Неверный результат

select this_.* from Companies this_ where 
  INNER JOIN Company_Customercategory a 
  on this_.companyId = a.companyId 
  and a.CUSTOMERCATEGORYID = 1
  and 1=1 INNER JOIN Company_Customercategory b 
  on this_.companyId = b.companyId 
  and b.CUSTOMERCATEGORYID = 6

Ожидаемый SQL

select * from companies c
  inner join Company_Customercategory a
  on c.companyId = a.companyId
  and a.CUSTOMERCATEGORYID = 1
  inner JOIN Company_Customercategory b
  on a.companyId = b.companyId
  and b.CUSTOMERCATEGORYID = 6

Ценю вашу помощь.Спасибо.

1 Ответ

0 голосов
/ 10 марта 2019

Существует старая ошибка Hibernate HHH-879 по проблеме org.hibernate.QueryException: duplicate association path, открытая 2005 и все еще открытая ...

Другая проблема закрыта без решения HHH-7882

Так что вариант 1) скорее не подходит.

Но в комментариях к вышеупомянутой ошибке полезный обходной путь упоминается с использованием exists

Так что используйте дважды sqlRestriction с exists и коррелированным подзапросом, фильтрующим категорию пропппера.Вы получите только компаний , подключенных к обеим категориям.

crit.add( Restrictions.sqlRestriction( 
  "exists (select null from Company_Customercategory a where {alias}.company_Id = a.company_Id and a.CUSTOMERCATEGORYID = ?)",
  1, IntegerType.INSTANCE ) );
crit.add( Restrictions.sqlRestriction( 
  "exists (select null from Company_Customercategory a where {alias}.company_Id = a.company_Id and a.CUSTOMERCATEGORYID = ?)",
  6, IntegerType.INSTANCE ) );

Это приведет к следующему запросу, который даст правильный результат

select this_.COMPANY_ID as COMPANY_ID1_2_0_, this_.COMPANY_NAME as COMPANY_NAME2_2_0_ 
from COMPANIES this_ 
where exists (select null from Company_Customercategory a 
              where this_.company_Id = a.company_Id and a.CUSTOMERCATEGORYID =  ?) and 
      exists (select null from Company_Customercategory a 
              where this_.company_Id = a.company_Id and a.CUSTOMERCATEGORYID = ?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...