Nano Hash - криптовалюты, майнинг, программирование

Запросы Hibernate Criteria и как эффективно объединять данные?

"ЭТО МОЙ SQL, КОТОРЫЙ Я ХОЧУ ПРЕОБРАЗОВАТЬ В CRTIERIA:

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

Привет, народ. я пытался использовать 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 join SecureUser на be1.id=s.blogEntryId (фактическая связь внешнего ключа не определена в таблицах, сущности SecureUser просто помечаются соответствующим идентификатором BlogEntry при их создании)

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

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


  • Если вы не можете сделать это с HQL, вы не сможете сделать это с Criteria: Criteria более ограничены, чем HQL. И, пожалуйста, перезапишите свой пример кода без всех этих PropertyName.BLOG.getName(): это сделает ваш код совершенно нечитаемым. 12.03.2012
  • шиш - какой облом. то, что я пытаюсь сделать, кажется таким простым. Спасибо. 13.03.2012
  • кстати, всем. я знаю, что могу делать подвыборки, но в моем случае это наихудшая альтернатива. UNION примерно в 7 раз быстрее. :) 13.03.2012

Ответы:


1

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.
12.03.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..