Hibernate搜索查询

时间:2015-04-23 08:39:06

标签: java mysql hibernate

我有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: example@example.com
Uczelnia: Example School
Doswiadczenie: Example experience   
Skad slyszal: Friends
Obszary zainteresowan: Java.  Android.  Technologie WWW (HTML, CSS, JavaScript).  Projektowanie aplikacji.

但是当我使用我的搜索方法并将列表传递给wyswietlWybrane时(在wyswietlWszystkie我也将列表传递给该方法)。

我输出如下:(搜索:Java):

1. Krystian Example
Telefon: 900900900
Email: example@example.com
Uczelnia: Example School
Doswiadczenie: Example experience   
Skad slyszal: Friends
Obszary zainteresowan: 

1. Krystian Example
Telefon: 900900900
Email: example@example.com
Uczelnia: Example School
Doswiadczenie: Example experience   
Skad slyszal: Friends
Obszary zainteresowan: 

你可以看到它加倍,我看不到“obszary zaintereson”。

现在搜索:Java和Android gaves没有结果(应该因为这个人有两个)。

for Technologie WWW and Java:

1. Krystian Example
Telefon: 900900900
Email: example@example.com
Uczelnia: Example School
Doswiadczenie: Example experience   
Skad slyszal: Friends
Obszary zainteresowan: 

所有类等已经包含在我在帖子开头提供链接的主题中。

dane osobowe table zainteresowania table

如何进行搜索查询?它的表现如此疯狂?

2 个答案:

答案 0 :(得分:1)

在查看您的查询后,我意识到您的HQL存在一些需要解决的问题。请参阅此处的部分:

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

  

获取连接通常不需要分配别名,因为关联对象不应该在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)

我不会在任何地方看到这个别名,我也不会在你的任何一张表中看到这个列。你确定需要吗?

因此,现在这将为您提供已按z子项的属性过滤的父实体。 z子项是懒惰的,所以你必须通过z ID独立查询它们,或者你应该能够在同一个hibernate事务中懒惰地获取它们只需调用getter方法返回z子列表。

答案 1 :(得分:1)

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

这解决了我的问题。