Запросы Hibernate Criteria и как эффективно объединять данные? - PullRequest
0 голосов
/ 12 марта 2012

"Это мой SQL, который я хочу преобразовать в Критию:

выберите be. * Из BlogEntry присоединиться к блогу b на be.blog = b.id присоединиться к подписчику f на b.id = f.blogId, где be.publishStatus = 'опубликовано' и be.secured = false и f.user =? объединение выбрать be1. * из BlogEntry be1 присоединиться к SecureUser s на be1.id = s.blogEntryId присоединиться к пользователю u на s.userProfile = u.userProfile и u.id =? заказ по publishDate desc ";

привет, ребята. Я пытался использовать HQL и нативный SQL для выполнения вышеуказанного запроса, и я был разочарован на каждом шагу, по большей части, потому что выполнение UNION в Hibernate супер неловко. даже если вы попробуете SQLQuery, у вас все еще будет полный беспорядок установления отношений между сущностями, поскольку вы будете вынуждены включать каждый отдельный атрибут каждого подкласса, на который есть ссылка в SQL. это оказывается полной болью, чтобы пройти.

Итак, я перехожу к возможному решению запроса критериев, но я думаю, что мне нужна помощь. приведенный ниже запрос полностью подходит для MySQL и работает быстро, как молния. Горб, который я пытаюсь преодолеть с помощью критерия, заключается в том, что некоторые из моих отношений сущностей определяются ссылками на внешние ключи в таблицах, а некоторые нет. когда они есть, я, конечно, могу сделать что-то вроде этого (что оценивает часть моего запроса перед UNION):

ExtendedDetachedCriteria entryDetachedCriteria = extendedDetachedCriteria.forClass (BlogEntry.class); entryDetachedCriteria.createAlias ​​( "blogEntry", "blogEntry"); entryDetachedCriteria.createAlias ​​("blogEntry.blog", "blog");

и т. Д. И т. Д. *

ОДНАКО, когда я присоединяюсь к данным другим способом, как в этой части SQL:

выберите be1. * Из BlogEntry be1 присоединитесь к SecureUser s по be1.id = s.blogEntryId (в таблицах не определено фактическое отношение внешнего ключа, сущности SecureUser просто помечаются соответствующим идентификатором BlogEntry при их создании)

как мне писать запросы критериев иначе, чем показано выше?

Я понимаю, что подобные вопросы - это полная боль, чтобы заставить вас задуматься, если вы еще не до конца пытаетесь решить - пожалуйста, извините за запутанность вопроса, который я задаю. Я был бы очень признателен за любые рекомендации, которые кто-то мог бы предложить, даже если это «соберись в спячку, да, глупец!». вроде застрял на данный момент.

1 Ответ

0 голосов
/ 13 марта 2012

createAlias ​​создает внутреннее соединение, используя связь между сущностями.Итак,

 criteria.createAlias("blogEntry","blogEntry"); 

эквивалентно следующему HQL:

inner join rootEntity.blogEntry as blogEntry.

Корневой объект - BlogEntry.И я полагаю, у вас нет поля blogEntry в сущности BlogEntry.Так что эта строка не имеет смысла.

Если у вас нет никакой связи между двумя сущностями, вы не можете сделать соединение.Вы сводитесь к созданию внутреннего соединения в форме равенства между двумя полями в предложении where:

select be1 from BlogEntry be1, SecureUser s 
where be1.id = s.blogEntryId

Но поскольку Criteria позволяет выбирать только из один корневой объект,и ряд связанных ассоциаций, это невозможно сделать с помощью Criteria.

Ваши лучшие ставки:

  • , чтобы сделать это в SQL
  • , чтобы сделать это, используя2 отдельных запроса HQL и объединение результатов с использованием Java.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...