2015-04-23 179 views
2

我有2列,一個包含人,第二個包含他們的利益。休眠搜索查詢

我需要根據自己的興趣搜索查詢。

(如果你需要一些信息,我沒有在這裏給它,我可能在這裏給了它:Java SQL Query - Hibernate

在這個時刻,我想這樣做這樣的:

Query query = session.createQuery("SELECT new com.mycompany.kwestionariusz.Osoba(o.id, o.imie, o.nazwisko, o.telefon, o.email, o.uczelnia, o.doswiadczenie, o.skadSlyszal) from Osoba as o INNER JOIN o.zainteresowania as z FETCH ALL PROPERTIES WHERE ((o.id) = (id_osoby)) and (LOWER(z.zainteresowanie) LIKE ?) and (LOWER(z.zainteresowanie) LIKE ?) and (LOWER(z.zainteresowanie) LIKE ?) and (LOWER(z.zainteresowanie) LIKE ?) and (LOWER(z.zainteresowanie) LIKE ?)"); 
     //Query query2 = session.createQuery("SELECT new com.mycompany.kwestionariusz.Osoba(o.id, o.imie, o.nazwisko, o.telefon, o.email, o.uczelnia, o.doswiadczenie, o.skadSlyszal) from Osoba as o INNER JOIN o.zainteresowania as z FETCH ALL PROPERTIES WHERE ((o.id) = (id_osoby)) and (LOWER(z.zainteresowanie) LIKE ?) and (LOWER(z.zainteresowanie) LIKE ?) and (LOWER(z.zainteresowanie) LIKE ?) and (LOWER(z.zainteresowanie) LIKE ?) and (LOWER(z.zainteresowanie) LIKE ?)");  
     query.setString(0,"%"+input1+"%"); 
     query.setString(1,"%"+input2+"%"); 
     query.setString(2,"%"+input3+"%"); 
     query.setString(3,"%"+input4+"%"); 
     query.setString(4,"%"+input5+"%");  

     List<Osoba> osoby = query.list(); // robimy sobie liste na podst zapytania 
     wyswietlWybrane(osoby); 

wyswietlWybrane方法:

private void wyswietlWybrane(List<Osoba> osoby) { 

     for (Osoba a : osoby) { 
      List zainteresowania1 = a.getZainteresowania();   
      System.out.println("\n\n" + a.getId() +". " + a.getImie() + " " + a.getNazwisko() + "\nTelefon: " + a.getTelefon() + "\nEmail: " + a.getEmail() + "\nUczelnia: " + a.getUczelnia() + "\nDoswiadczenie: " + a.getDoswiadczenie() + "\t\n" + "Skad slyszal: " + a.getSkadSlyszal()); 
      System.out.print("Obszary zainteresowan: "); 
      for (Iterator iterator2 = zainteresowania1.iterator(); iterator2.hasNext();){ 
       Zainteresowania nazwa = (Zainteresowania) iterator2.next(); 
       System.out.print(nazwa.getZainteresowanie() + ". "); 
      } 
     } 
    } 

勾住ShowAll方法:

public void wyswietlWszystkie() 
     {    
      try 
      {   
       Session session = HibernateUtil.getSessionFactory().openSession(); 
       session.beginTransaction(); 
       List<Osoba> osoby = session.createQuery("from Osoba").list(); // tworzymy sobie liste z zapytania do bazy ktora wyswietli nam wszystkich 

       wyswietlWybrane(osoby); // przekazujym ta liste do innej i wyswietlamy 

       session.getTransaction().commit(); 
       session.close(); 
      } 
      catch (HibernateException e) 
      {  
       HibernateUtil.getSessionFactory().close(); //Destroy this SessionFactory and release all resources (caches, connection pools, etc). 
      } 
     } 

我現在使用的查詢有一些問題。

首先。 當我使用WyswietlWszystkie方法,然後我得到了這樣的輸出:

1. Krystian Example 
Telefon: 900900900 
Email: [email protected] 
Uczelnia: Example School 
Doswiadczenie: Example experience 
Skad slyszal: Friends 
Obszary zainteresowan: Java. Android. Technologie WWW (HTML, CSS, JavaScript). Projektowanie aplikacji. 

,但是當我用我的搜索方法,並通過列表wyswietlWybrane(在wyswietlWszystkie IM傳遞列表給該方法太)。

我得到這樣的輸出:(其搜索:JAVA):

1. Krystian Example 
Telefon: 900900900 
Email: [email protected] 
Uczelnia: Example School 
Doswiadczenie: Example experience 
Skad slyszal: Friends 
Obszary zainteresowan: 

1. Krystian Example 
Telefon: 900900900 
Email: [email protected] 
Uczelnia: Example School 
Doswiadczenie: Example experience 
Skad slyszal: Friends 
Obszary zainteresowan: 

,你可以看到它的一倍,我不能看到 「obszary zaintereson」。

現在搜索:Java和Android沒有給出任何結果(它應該因爲這個人有他們兩個)。

爲TECHNOLOGIE WWW和Java:

1. Krystian Example 
Telefon: 900900900 
Email: [email protected] 
Uczelnia: Example School 
Doswiadczenie: Example experience 
Skad slyszal: Friends 
Obszary zainteresowan: 

所有類等已經包含在線程我在文章的開頭給出的鏈接。

dane osobowe table zainteresowania table

我該怎麼辦檢索查詢的?它表演如此瘋狂?

+1

波蘭語名稱變量和方法名稱對於非斯拉夫語者非常難以遵循。你能把它們翻譯成英文,包括評論嗎? –

+0

對不起,我剛纔看到你的評論,肯定會在幾分鐘內做到這一點:) – arienn

回答

1
"select o from Osoba o " + 
"join o.zainteresowania z " + 
"where z.zainteresowanie in (:tags) " + 
"group by o " + 
"having count(z)=:tag_count"; 

這解決了我的問題。

1

看完您的查詢後,我發現您的HQL需要解決一些問題。在這裏看到的部分:

https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/queryhql.html#queryhql-joins

一個fetch連接通常不需要被指定別名,因爲相關聯的對象不應當在where子句(或其它任何子句)

中使用

因此,通過執行FETCH ALL PROPERTIES,您無法在同一查詢中過濾z個子項。您的查詢應該是這樣的,那麼:

SELECT new com.mycompany.kwestionariusz.Osoba(
    o.id, o.imie, o.nazwisko, o.telefon, o.email, 
    o.uczelnia, o.doswiadczenie, o.skadSlyszal) 
from Osoba as o 
    INNER JOIN o.zainteresowania as z 
WHERE ((o.id) = (id_osoby)) 
and (LOWER(z.zainteresowanie) LIKE ?) 
and (LOWER(z.zainteresowanie) LIKE ?) 
and (LOWER(z.zainteresowanie) LIKE ?) 
and (LOWER(z.zainteresowanie) LIKE ?) 
and (LOWER(z.zainteresowanie) LIKE ?) 

我不知道的唯一的事情是這樣的屬性在這裏:

(id_osoby) 

我沒有看到這個被混淆的任何地方,我沒有看到這個列在你的任何表中。你確定這是需要嗎?

所以這現在會給你o父實體已被z子的屬性過濾。 z孩子很懶,所以你必須通過z ID獨立地查詢這些孩子,或者你應該能夠懶惰地在相同的hibernate事務中獲取它們,只需調用getter方法返回z孩子列表。

+0

哦,我忘了過去這裏我的新查詢,我改變它沒有獲取等,id_osoby是Zainteresowania表中的人的ID,它是一樣的作爲Osoba表中的ID – arienn

+0

但仍然在我更改查詢後,結果與本主題中的問題相同。我刪除了SELECT DISTINCT兩次選擇同一個人的問題,但仍然沒有搜索到一些查詢。還有一些奇怪的事情發生在我的ID列上,每增加一個人就增加2-3個,它用來增加1.我沒有改變任何東西,它在地圖文件中的自動增加,所以我不知道什麼可能是錯誤的 – arienn

+1

@arienn我認爲select distinct是一個好主意,但要真正理解HQL查詢會發生什麼,您需要將hibernate.showSql屬性設置爲true,並查看您的控制檯輸出以查看實際的SQL語句產生。這會給你一個關於從數據庫中檢索什麼的線索。 –