java - Hibernate 搜索查询

标签 java mysql hibernate

我有两列,第一列包含人员,第二列包含他们的兴趣。

我需要根据他们的兴趣进行搜索查询。

(如果您需要一些信息而我没有在这里提供,我可能在这里提供: 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() + ".  "); 
            }
        } 
    }

显示全部方法:

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: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="791c01181409151c391c01181409151c571a1614" rel="noreferrer noopener nofollow">[email protected]</a>
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: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0c69746d617c60694c69746d617c6069226f6361" rel="noreferrer noopener nofollow">[email protected]</a>
Uczelnia: Example School
Doswiadczenie: Example experience   
Skad slyszal: Friends
Obszary zainteresowan: 

1. Krystian Example
Telefon: 900900900
Email: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="57322f363a273b3217322f363a273b327934383a" rel="noreferrer noopener nofollow">[email protected]</a>
Uczelnia: Example School
Doswiadczenie: Example experience   
Skad slyszal: Friends
Obszary zainteresowan: 

正如你所看到的,它加倍了,而我看不到“obszary zaintereson”。

现在搜索:Java 和 Android 没有给出任何结果(应该是因为这个人两者都有)。

对于技术 WWW 和 Java:

1. Krystian Example
Telefon: 900900900
Email: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b2d7cad3dfc2ded7f2d7cad3dfc2ded79cd1dddf" rel="noreferrer noopener nofollow">[email protected]</a>
Uczelnia: Example School
Doswiadczenie: Example experience   
Skad slyszal: Friends
Obszary zainteresowan: 

所有类等都已包含在我在帖子开头给出的链接的线程中。

dane osobowe table zainteresowania table

如何进行搜索查询?搞什么这么疯狂?

最佳答案

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

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

A fetch join does not usually need to assign an alias, because the associated objects should not be used in the where clause (or any other clause)

因此,通过执行 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 子级属性过滤的 o 父级实体。然而,z 子项是惰性的,因此您必须通过 z ID 独立查询这些子项,或者您应该能够在同一 hibernate 事务中通过调用 getter 方法返回 z 子项列表来惰性获取它们。

关于java - Hibernate 搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29818019/

相关文章:

java - 这是否违反了 EJB 限制?

java - Android Settings.ACTION_DISPLAY_SETTINGS 未找到

php - 选择用于网页的随机记录

database - 将grails应用程序部署到Oracle iPlanet Web Server

java - 使用 Spring @Transactionnal,Spring 如何知道使用哪个数据源?

java - 重新附加父实体时删除子实体

java - Android DownloadManager 是否支持恢复损坏的下载

java - JDBC 将多个子表连接到父表,我如何知道结果行来自哪个表?

php - 如何将数组插入一行?

mysql - Jmeter连接异常