2012-02-22 136 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