Java SQL 查询 - 休眠

Java SQL Query - Hibernate

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

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();       
    }  

例如。当我想打印所有内容时,我只使用:

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

打印我通过的内容的方法:

private void wyswietlWybrane(List<Osoba> osoby) {



    for (Osoba a : osoby) {
List zainteresowania1 = a.getZainteresowania();        
        System.out.println(a.getId() +". " + a.getImie() + " " + a.getNazwisko() + "\nTelefon: " + a.getTelefon() + "\nEmail: " + a.getEmail() + "\nUczelnia: " + a.getUczelnia() + "\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() + ".  "); 
        }
    } 
    }

地图文件:

大荞麦面

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.mycompany.kwestionariusz">

    <class name="Osoba" table="DANEOSOBOWE">

        <id name="id" column="ID" type="integer">
            <generator class="native"/>
        </id>

        <property name="imie" column="Imie"/>

        <property name="nazwisko" column="Nazwisko"/>

        <property name="telefon" column="Telefon"/>

                <property name="email" column="Email" />

                <property name="uczelnia" column="Uczelnia" />

                <property name="doswiadczenie" column="Doswiadczenie" />

                <list name="zainteresowania" cascade="all">
                <key column="id_osoby"/>
                <list-index column="idx"/>
                <one-to-many class="Zainteresowania"/>
                </list>

                <property name="skadSlyszal" column="SkadSlyszal" />

    </class>

</hibernate-mapping>

赞特雷索瓦尼亚:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.mycompany.kwestionariusz">

   <class name="Zainteresowania" table="ZAINTERESOWANIA">
                <id name="id" type="int" column="id">
                <generator class="native"/>
                </id>
                <property name="zainteresowanie" column="zainteresowanie" type="string"/>
        </class>

</hibernate-mapping>

荞麦面 class:

    private int id;
    private String imie;
    private String nazwisko;
    private String email;
    private String telefon;
    private String uczelnia;
    private String doswiadczenie;    
    private String skadSlyszal;
    private List zainteresowania;   

  public Osoba(){ // domyslny
  }

  // konstruktor zeby mozna bylo sobie w jednej linijce dodawac osobe
   public Osoba(String imie1, String nazwisko1, String telefon1, String email1, String uczelnia1, String doswiadczenie1, String skadSlyszal1 ){
       this.imie = imie1;
       this.nazwisko = nazwisko1;
       this.email = email1;
       this.telefon = telefon1;
       this.uczelnia = uczelnia1;
       this.doswiadczenie = doswiadczenie1;
       this.skadSlyszal = skadSlyszal1;
       }
   // kontr przyj caly obiekt
   public Osoba(Osoba tymczasowa){
       this.imie = tymczasowa.imie;
       this.nazwisko = tymczasowa.nazwisko;
       this.email = tymczasowa.email;
       this.telefon = tymczasowa.telefon;
       this.uczelnia = tymczasowa.uczelnia;
       this.doswiadczenie = tymczasowa.doswiadczenie;
       this.skadSlyszal = tymczasowa.skadSlyszal;
       }
  // gettery, settery
  public int getId() {
      return id;
  }  

  public String getImie() {
    return imie;
  }

  public String getNazwisko() {
    return nazwisko;
  }

  public String getEmail() {
    return email;
  }

  public String getTelefon() {
    return telefon;
  }

  public String getUczelnia() {
    return uczelnia;
  }

  public String getDoswiadczenie() {
    return doswiadczenie;
  }

  public List getZainteresowania() {
     return zainteresowania;
  }

  public String getSkadSlyszal() {
     return skadSlyszal;
  }

  public void setImie(String string) {
    this.imie = string;
  }

  public void setId(int in) {
    this.id = in;
  }

  public void setNazwisko(String string) {
    this.nazwisko = string;
  }

  public void setEmail(String string) {
    this.email = string;
  }

  public void setTelefon(String string) {
    this.telefon = string;
  }

  public void setUczelnia(String string) {
    this.uczelnia = string;
  }

  public void setDoswiadczenie(String string) {
    this.doswiadczenie = string;
  }

  public void setZainteresowania(List string) {
    this.zainteresowania = string;
  }

  public void setSkadSlyszal(String string) {
    this.skadSlyszal = string;
  }

野猪蹄class:

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 方法,张贴在那里)

for (Osoba a : osoby) {List zainteresowania1 = a.getZainteresowania(); 

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

wyswietlWybrane(osoby);

我确实需要帮助,尝试了很多方法,似乎都没有用。

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

您 运行 陷入此问题的原因是您在查询的 FROM 部分中指定了两个 Hibernate 实体,并且默认情况下您选择了两个表的每一列,因为您没有指定 SELECT.

这将返回实体属性的 Object[],这就是您获得转换异常的原因。

要解决此问题,请明确尝试 SELECT 每个命名为 属性 的 o 实体,它应该足够聪明以正确映射到 o 实体而不是 Object[]。

我还注意到您实际上并没有将两个表连接在一起。我相信这会给你一个笛卡尔积。要解决此问题,请在您的过滤器中添加一个连接:

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

这就是解决方案,还有一些其他问题,但至少正在制作人员名单