JavaSQL查询-Hibernate

JavaSQL查询-Hibernate,java,hibernate,hql,Java,Hibernate,Hql,所以我得到了一个查询,从中生成了列表,然后将该列表传递给另一个应该打印它的方法 Query query = session.createQuery("from Osoba as o FETCH ALL PROPERTIES WHERE ((o.id) = (id_osoby)) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (L

所以我得到了一个查询,从中生成了列表,然后将该列表传递给另一个应该打印它的方法

Query query = session.createQuery("from Osoba as o FETCH ALL PROPERTIES WHERE ((o.id) = (id_osoby)) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?)");
         // Query query = session.createQuery("from Osoba WHERE (LOWER(zainteresowania) LIKE ?)"); // Stara, zachowana tymczasowo            
            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);

            session.getTransaction().commit();
            session.close();       
    }  
扎瓦尼亚班:

private int id;
    private String zainteresowanie;

    public Zainteresowania(){ // domyslny
    }
    public Zainteresowania(String zainteresowanie){
    this.zainteresowanie = zainteresowanie;
    }  

    public int getId() {
      return id;
    }
    public void setId(int id) {
      this.id = id;
    }
    public String getZainteresowanie() {
      return zainteresowanie;
    }
    public void setZainteresowanie(String zainteresowanie) {
      this.zainteresowanie = zainteresowanie;
    }
好的,当我尝试执行这个搜索查询并传递参数时,我得到一个错误:

ERROR:  Invalid path: 'null.zainteresowanie'
kwi 22, 2015 3:05:00 PM org.hibernate.hql.internal.ast.ErrorCounter reportError
ERROR:  Invalid path: 'null.zainteresowanie'
 Invalid path: 'null.zainteresowanie'
Exception in thread "main" org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'null.zainteresowanie' [from com.mycompany.kwestionariusz.Osoba as o FETCH ALL PROPERTIES WHERE ((o.id) = (id_osoby)) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?)]
当我将查询更改为此:

Query query = session.createQuery("from Osoba as 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 ?)");
我得到一个错误:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.mycompany.kwestionariusz.Osoba
    at com.mycompany.kwestionariusz.Osoba.wyswietlWybrane(Osoba.java:226)
    at com.mycompany.kwestionariusz.Osoba.wyszukajOsoby(Osoba.java:218)
    at com.mycompany.kwestionariusz.main.main(main.java:42)
第226行(其wyswietlWybrane方法,张贴在那里)

第218行(搜索方法的一部分):

我真的需要帮助,尝试了很多方法,但似乎没有任何效果


我认为原因是搜索查询正在创建Osoba列表以外的其他列表-但我需要将Osoba ID与Zainterestowania ID_Osoby进行比较,因此,如何做到这一点,并且仍然能够将我的结果列表传递给我的wyswietlWybrane方法?

遇到此问题的原因是,在查询的FROM部分指定了两个Hibernate实体,并且默认情况下,由于没有指定SELECT,所以会选择这两个表的每一列

这将返回实体属性的对象[],这就是您获得强制转换异常的原因

要修复此问题,请尝试显式选择所需的o实体的每个命名属性,并且它应该足够智能,可以正确映射到o实体,而不是对象[]

我还注意到,您实际上并没有将两个表连接在一起。我相信这会给你一个笛卡尔积。要修复此问题,请向筛选器添加联接:

... from Osoba as o INNER JOIN o.zainteresowania as z FETCH ALL ...
这会将z实体限制为在o中作为子实体存在的实体

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 ?)");

这就是解决方案,还有一些其他问题,但至少列出了人员名单

这是太多的代码,无法消化。请只发布导致错误的相关代码。若需要,那个么只发布你们的全部代码。我现在尝试了这种方式,遗憾的是错误仍然在这里,另一个<代码>线程“main”java.lang.IllegalArgumentException中的异常:要遍历的节点不能为null查询:
query query=session.createQuery(“o.id,o.imie,o.nazwisko,o.telefon,o.email,o.uczelnia,o.doswiadczenie,o.skadslyszal from Osoba as o AND o.zainterestowania=z获取所有属性,其中((o.id)=(id_osoby))和(较低的(z.zainterestowanie)LIKE?)和(较低的(z.zainterestowanie)LIKE?)和(较低的(z.zainterestowanie)LIKE?)和(较低的(z.zainterestowanie)LIKE?)
kwi 22,2015 3:30:20 PM org.hibernate.hql.internal.ast.ErrorCounter reportError错误:第1行:意外标记:o kwi 22,2015 3:30:20 PM org.hibernate.hql.internal.ast.ErrorCounter reportError错误:第1行:意外标记:o
@arienn抱歉,我说得很糟糕。请看我的编辑。您需要内部连接o.zaiInterestowania,因为zQuery现在看起来是这样的:
Query Query=session.createQuery(“选择o.id、o.imie、o.nazzwisko、o.telefon、o.email、o.uczelnia、o.doswiadczenie、o.skadSlyszal从Osoba作为o内部连接o.zainterestowania作为z获取所有属性,其中((o.id)=(id_osoby))和(LOWER(z.zainterestowanie)like?)和(低(z.Zainterestowanie)LIKE?)和(低(z.Zainterestowanie)LIKE?)和(低(z.Zainterestowanie)LIKE?)和(低(z.Zainterestowanie)LIKE?)但我回到了原来的位置<代码>线程“main”java.lang.ClassCastException中的异常:[Ljava.lang.Object;不能在com.mycompany.kwestionariusz.osoban.wyswietlWybrane(Osoba.java:226)的com.mycompany.kwestionariusz.Osoba.wyszukajosby(Osoba.java:218)的com.mycompany.kwestionariusz.main.main(main.java:42)上强制转换为com.mycompany.kwestionariusz.kwestionariusz.kosz
ERROR:  Invalid path: 'null.zainteresowanie'
kwi 22, 2015 3:05:00 PM org.hibernate.hql.internal.ast.ErrorCounter reportError
ERROR:  Invalid path: 'null.zainteresowanie'
 Invalid path: 'null.zainteresowanie'
Exception in thread "main" org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'null.zainteresowanie' [from com.mycompany.kwestionariusz.Osoba as o FETCH ALL PROPERTIES WHERE ((o.id) = (id_osoby)) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?) and (LOWER(Zainteresowania.zainteresowanie) LIKE ?)]
Query query = session.createQuery("from Osoba as 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 ?)");
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.mycompany.kwestionariusz.Osoba
    at com.mycompany.kwestionariusz.Osoba.wyswietlWybrane(Osoba.java:226)
    at com.mycompany.kwestionariusz.Osoba.wyszukajOsoby(Osoba.java:218)
    at com.mycompany.kwestionariusz.main.main(main.java:42)
for (Osoba a : osoby) {List zainteresowania1 = a.getZainteresowania(); 
wyswietlWybrane(osoby);
... from Osoba as o INNER JOIN o.zainteresowania as z FETCH ALL ...
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 ?)");