2012-02-22 137 views
0

我有一张桌子看起来像这样;休眠查询perfomance

@Table 
public class Person { 

    private String name; 
    private String address; 
    ... 
    private String score; 
} 

在我的数据库中,我现在有很多名字,地址和分数的人。比方说,我从另一个系统中检索人员列表,其中一些人已经存在于数据库中,另一些人是新的。

在我将它们保存在我的数据库中之前,我想检查它们是否已经存在(避免重复),并且可能会改变分数,如果我进入的人与我已有的人相同,但分数不同。

如果我想选择所有存在的人,最好的查询是什么? (例如,相同的名称和地址)。我的人员表可以包含大量人员,而我从其他系统获得的人员名单也很大(新的或更新的分数)。我需要一个关于性能的查询:-)。

我正在使用Java和Hibernate。任何人?

编辑:最后的SQL可能看起来像

select * from Person where name='Paul' AND address='road1 
OR name='John' AND address='road2' 
OR name='Stella' AND address='road3' 

和许多许多..上面的SQL ATLEAST解释了我想要的东西。

回答

0

这样做的一种方法是外连接两个表并列出一侧不存在的所有人。像这样(TSQL):

SELECT left.* from db1.owner.persons left LEFT JOIN db2.owner.persons right ON left.name=right.name AND left.address=right.address WHERE right.id IS NULL 

然后,您可以使用ISession的CreateSQLQuery方法来获取人员列表。

在C#

我们写这样

var list=session.CreateSQLQuery(queryString,"left",new []{typeof(Person)}).List(); 

,但我不认为如果你想在这个查询,以获得性能的或许是把一些指标上是必要的,是一个Java

很大的不同每个表格(例如姓名和地址)

+0

谢谢您的回复!也许我的问题还不够清楚。这不是两张桌子,只有一张。基本上我得到一个“名单人”。我只想比较我获得的列表中的人员和我的数据库中的人员。 – KimAMartinsen 2012-02-22 08:45:56

+0

我以为你想实现从其他系统获取新用户的逻辑 – Beatles1692 2012-02-22 09:54:50

0

如果我理解正确,您已经拥有了所有“外部”人员。

我会创建一个Map<String, ExternalPerson>,其中包含按名称索引的所有外部人员。

然后我会问这张地图的keySet()以获得从数据库中获得的人员列表。

我会再执行下面的查询:

select p from Person p where p.name in (:names) 

你只是必须确保名称的数量不高于你的数据库(1000甲骨文)施加的限制。如果是这样,您必须将该组分成几个子集,并对每个子集重复查询。

然后迭代查询结果。对于找到的每个人,使用地图或外部人员获取其相应的外部人员,并更新当前人员的分数。然后从地图中移除外部人员。

在过程结束时,映射包含数据库中不存在的外部人员,并且必须创建该外部人员。

如果设定者是真的戒严,确保使用query.scroll()而非query.list()通过人进行迭代,并定期冲洗并清除会话中this section of the reference manual解释,以避免内存问题。

+0

谢谢你的回复!我们正在关闭,但有一件事我想知道;如果我只能按名称进行索引,这将是一个很好的答案,但我也必须按地址进行索引。 (我给出了愚蠢的例子,但它并不是真正的人物表格:-))。如果人名和地址相同,那么我想要那个人。如果我扩展到从Person p中选择p,其中(:名称)中的p.name和((address)中的p.address)将起作用? (这个表中的名字或地址都不是唯一的(或主键))我的第一个猜测是不是....? – KimAMartinsen 2012-02-22 09:07:48

+0

..和名字和地址当然是唯一的:-) – KimAMartinsen 2012-02-22 09:15:04

+0

我想你必须动态地编写你的查询。考虑使用带有循环的条件查询来生成您的分析。我认为HQL支持'(a,b)in(('foo','bar'),('baz','blam'))'的语法,但我不知道是否可以绑定一个集合元组''name,address>'这样的查询。 – 2012-02-22 09:39:56