mardi 5 mai 2015

Search query broken after change XML mapping to annotations

I have spring based program, that searches from DB based on what I pick.

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MapKeyColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;

My mapping files:

ListaZainteresowan:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://ift.tt/UNuKEd">
<hibernate-mapping>
  <class name="pl.ckzeto.kwestionariusz.ListaZainteresowan" table="zainteresowania">
    <id column="id" name="id" type="int">
      <generator class="native"/>
    </id>
    <property column="zainteresowanie" name="zainteresowanie" type="string"/>
  </class>
</hibernate-mapping>

Osoba:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://ift.tt/IMLJSW">
<hibernate-mapping package="pl.ckzeto.kwestionariusz">
  <class name="Osoba" table="OSOBA">
    <id column="id" name="id" type="int">
      <generator class="native"/>
    </id>
    <property column="Imie" name="imie"/>
    <property column="Nazwisko" name="nazwisko"/>
    <property column="Telefon" name="telefon"/>
    <property column="Email" name="email"/>
    <property column="Uczelnia" name="uczelnia"/>
    <property column="Doswiadczenie" name="doswiadczenie"/>
    <list cascade="all" name="zainteresowania">
      <key column="id_osoby"/>
      <list-index column="idx"/>
      <one-to-many class="Zainteresowania"/>
    </list>
    <property column="SkadSlyszal" name="skadSlyszal"/>
  </class>
</hibernate-mapping>

Zainteresowania

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://ift.tt/UNuKEd">
<hibernate-mapping package="pl.ckzeto.kwestionariusz">
  <class name="Zainteresowania" table="OSOBA_ZAINTERESOWANIA">
    <id column="id" name="id" type="int">
      <generator class="native"/>
    </id>
    <property column="zainteresowanie" name="zainteresowanie" type="string"/>
  </class>
</hibernate-mapping>

All was working just fine before I changed XML mapping to annotations like that: Here I added annotations and Serializable because netbeans wanted me to do it with annotations

Zainteresowania:

@Entity
@Table(name="OSOBA_ZAINTERESOWANIA")
public class Zainteresowania implements Serializable { 

    @Id
    @Column(name = "id")
    @GeneratedValue
    private int id;

    @Column(name="zainteresowanie")
    private String zainteresowanie;

    public Zainteresowania(){ // domyslny
    }

Osoba: here it was private List<> zainteresowania = new ArrayList(); before, I had to change it to private List zainteresowania = new ArrayList(); because program didnt want to compile (it worked without annotations, only with them there was such a problem). Also serializable is added comparing to program based on XML mapping.

@Entity
@Table(name="OSOBA")
public class Osoba implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue
    private int id;

    @Column(name="Imie")
    private String imie;

    @Column(name="Nazwisko")
    private String nazwisko;

    @Column(name="Email")
    private String email;

    @Column(name="Telefon")
    private String telefon;

    @Column(name="Uczelnia")
    private String uczelnia;

    @Column(name="Doswiadczenie")
    private String doswiadczenie;  

    @Column(name="SkadSlyszal")
    private String skadSlyszal;

    @OneToMany(cascade=CascadeType.ALL)
    @MapKeyColumn(name="id_osoby")
    @org.hibernate.annotations.IndexColumn(name="idx") 
    private List<Zainteresowania> zainteresowania = new ArrayList(); 

  public Osoba(){ // domyslny    
  }

and ListaZainteresowan:

@Entity
@Table(name="zainteresowania")
public class ListaZainteresowan implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue
    private int id;

    @Column(name="zainteresowanie")
    private String zainteresowanie;

comparing to program based on xml annotations I added only serializable because netbeans wanted me to.

My DB search query is:

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

and again as I said it worked before I changed to annotations.

Now the problem is it only works when I dont choose any "zainteresowanie" - then I can see all people because then query is just:

select o from Osoba o 

But it doesnt work as it should anyway - the field Zainteresowania is empty now - so something is wrong, probably after changing List to but there was compiling error without it (after i added annotations, before it worked).

What to do?

Aucun commentaire:

Enregistrer un commentaire