Дилемма при использовании гибернации - PullRequest
2 голосов
/ 13 мая 2011

Я использую две таблицы для моего текущего проекта (он, безусловно, будет расти).

Первая таблица имеет одинаковое количество столбцов, т. Е.

id|name|surname|age|token         |currentpackage|difference
1 |me  | you   | 22|xc2e2144124sd |100           |0

Второй стол:

id|mirror|token|        connsize|price
81|server|xc2e2144124sd|100mbps |1000

Эти таблицы полны данных. В таблице table1 есть несколько строк с тем же значением токена, что и в таблице 2.

Я уже довольно долго гуглил решение, это лучшее, что я нашел:

http://www.mkyong.com/hibernate/hibernate-one-to-one-relationship-example/ а также http://www.vaannila.com/hibernate/hibernate-example/hibernate-mapping-one-to-one-1.html

Но я не думаю, что это применимо к моему делу (или они имеют). В этих примерах отношение является ключом, который является инкрементным, мой токен такой же, как и в базе данных.

Моя конечная цель - рассчитать разницу между текущей упаковкой и ценой

Что бы вы порекомендовали для этого? Я использую Java / Hibernate / Spring

Есть ли другой способ сообщить hibernate для связи чем-то другим, кроме первичного ключа? какой-нибудь пользовательский ключ, такой как токен в таблице 1? токен - это некая связь между таблицей 1 и таблицей 2. Его много (таблица1) к одному (таблица2).

ПОСЛЕДНИЕ ОБНОВЛЕНИЯ

Я пытаюсь сделать это с помощью запроса, чтобы вычесть эти два столбца:

UPDATE packages tl 
SET difference = (select (t2.price-t1.currentpackage) 
from packages t1, mirrors t2 
where t2.token= t1.token)

Я получил эту ошибку:

ERROR:  more than one row returned by a subquery used as an expression

Я, должно быть, перепробовал много вариантов, но ни один не работал

Попробовал также и тот же результат:

UPDATE packages X 
SET difference = (select Y.price-X.currentpackage
FROM packages X
LEFT OUTER JOIN mirrors Y
ON Y.token = X.token)

Кажется, это то, что я ищу, но я не могу включить это в свой запрос:

Вычесть значения из двух разных таблиц

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

Вы не сможете отобразить это отношение как многие-к-одному, не сделав token идентификатором во второй таблице.Тем не менее, есть несколько вещей, которые вы можете сделать:

  1. Вам даже нужно связать таблицы?Если ваша конечная цель состоит в том, чтобы вычислить разницу между currentpackage и price, как вы сказали, похоже, что вы могли бы сделать это в запросе.
  2. Если вам нужно связать таблицы, можете ли вы изменитьсхема?Я предполагаю, что id столбцы в обеих таблицах являются первичными ключами.Вы можете добавить second_id столбец (с любым подходящим именем) к первой таблице, которая будет внешним ключом для второй таблицы, и сопоставить их как многие-к-одному.
  3. Если вы не можете добавить новуюстолбец, вы можете сделать token первичным ключом во второй таблице?Это уникальный / не нулевой?На самом деле это последнее средство, так как оно будет включать в себя создание значения id в базе данных и / или отображение пользовательской вставки в Hibernate для сохранения существующей структуры таблицы.

Правка (на основеобновленный вопрос):

Теперь это не имеет ничего общего с Hibernate, поскольку запрос, который вы пытаетесь выполнить, (а) обновляется и (б) основан на SQL, но, тем не менее ... Предполагается, чтоЯ правильно вас понял, и вы пытаетесь обновить первую таблицу, чтобы она содержала разницу между соответствующей строкой во второй таблице и текущей строкой в ​​первой таблице. Вы можете сделать следующее:

update packages
   set difference = (select price
                      from mirrors m
                     where m.token = packages.token
   ) - currentpackage

Синтаксис может отличаться отмало зависит от вашей РСУБД;не все из них поддерживают коррелированные подзапросы в обновлении.Некоторые поддерживают обновление нескольких таблиц (например, MySQL или Postgres), затем вы можете написать запрос как:

update packages, mirrors
   set difference = mirrors.price - currentpackage
 where packages.token = mirrors.token
1 голос
/ 13 мая 2011

Сложно заставить Hibernate объединять таблицы чем-то отличным от первичного ключа одной из таблиц.Иногда это можно обойти, выполнив объединение так, как нравится Hibernate, и поместив условие «логическое объединение» в предложение were.

И если нет условия объединения, которое Hibernate хотел бы и соответствовало вашей логике, вам пришлось бы делать декартово произведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...