gpt4 book ai didi

java - hibernate 搜索查询

转载 作者:行者123 更新时间:2023-11-29 02:22:14 26 4
gpt4 key购买 nike

我有 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() + ". ");
}
}
}

显示全部方法:

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 没有给出任何结果(应该是因为这个人同时拥有它们)。

对于 Technologie WWW 和 Java:

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

所有类(class)等都已包含在我在文章开头提供链接的主题中。

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)

我在任何地方都没有看到这个别名,而且我在你的任何表格中都没有看到这一列。您确定需要这个吗?

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com