2015-04-23 161 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语句产生。这会给你一个关于从数据库中检索什么的线索。 –