2011-05-12 23 views
2

我对当前项目使用两个表格(它肯定会增长)。使用休眠时的困境

首先表有像列的负荷即

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

第二表:

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

这些表是满的数据。表1中有一些行与表2中的行有相同的标记值。

我GOOGLE了解决方案相当了很多,这是我找到了最好的:

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

但我不认为这些适用于我的情况下(或他们) 。在这些例子中,关系是增量式的关键,我的令牌只是它在数据库中的方式。

我的最终目标是能够计算currentpackage和价格

,你会推荐什么这之间的区别?我正在使用java /休眠/弹簧

是否有任何其他方式告诉hibernate链接其他主键的其他东西? 一些自定义键如表1中的标记?令牌是表1和表2之间的某种关系。它的很多(table1)到一个(table2)。

最新的更新

我试图通过查询这些。减去两列做到这一点:

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) 

这似乎正是我要找的,但我不能将其集成到我的查询:

Subtract Values from Two Different Tables

+0

您的意思是在两个表中都没有主键?为了能够使用hibernate,主键必须在所有涉及的表中。 – Bhushan 2011-05-12 21:00:14

+0

@Bhushan当然在这两个表中都有主键,但它们并不代表什么,因为它们彼此不同,唯一的常见列值是标记。 – London 2011-05-12 21:02:49

回答

3

如果没有在第二个表中创建token标识符,您将无法将此关系映射为多对一。也就是说,你可以做几件事:

  1. 你甚至需要关联表吗?如果您的最终目标是计算currentpackageprice之间的差异,那么您似乎可以在查询中这样做。
  2. 如果你确实需要关联这些表格,你能改变你的模式吗?我假设两个表中的id列都是主键。您可以将second_id列(使用任何适当的名称)添加到第一个将作为第二个表的外键并将它们映射为多对一的表。
  3. 如果你不能添加一个新列,你可以在第二个表中创建一个主键token吗?它是唯一的/不是空的?这是最后的手段,因为它将涉及在数据库中生成id值和/或在Hibernate中映射自定义插入以保留现有表结构。

编辑(基于更新的问题):

现在,这有一点做与Hibernate,因为你要执行查询(一)更新和(b)基于SQL的,但尽管如此......假设我理解正确的话,你和你试图更新1表包含在第二个表和当前行中第一个表中相应的行之间的区别,你可以做到以下几点:

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

根据您的RDBMS,语法可能会有所不同;并不是所有人都支持更新中的相关子查询。有些支持多表更新(如MySQL或Postgres),然后可以将查询写为:

update packages, mirrors 
    set difference = mirrors.price - currentpackage 
where packages.token = mirrors.token 
+0

@ ChssPly76 tnx我已经设法做到这一点与选项1 – London 2011-05-12 22:56:24

+0

@ ChssPly76我想我没有工作,我有查询没有产生正确的输出 – London 2011-05-12 23:07:27

+0

@伦敦如果关系是真正的多对一你在你的查询中需要使用聚集(比如'sum()')。您还需要将其与您正在更新的表关联起来。在你展示的任何一张表格中都没有“差异”栏,所以我不太确定你在这里做什么。 。 – ChssPly76 2011-05-12 23:33:05

1

这是棘手让Hibernate通过表之外的其他主键来连接表。你可以通过按照Hibernate喜欢的方式进行连接并将你的“逻辑连接”条件放入到子句中来解决这个问题。

如果没有连接条件,Hibernate会喜欢和套用你的逻辑,你将不得不做一个笛卡儿积。