2016-04-16 14 views
0

Ich habe 2 Tabellen prod (Waren) mithql Join konnte die Eigenschaft nicht auflösen; verwenden zwei Tabellen-Mapping

> id, catid(category), name, price 

Und Katze

> with id, catname. 

ich wählen möchte, wie dies in SQL

> select * from cat join prod on cat.id=prod.catid where 
> cat.name='catname'; 

Meine Frage ist;

Query query = session.createQuery("from prod pr join pr.cat ct with pr.catid=ct.id where ct.name=?"); 

Ich habe

konnte nicht lösen Eigenschaft: Katze: goods.prod [von goods.prod pr verbinden pr.cat ct mit pr.catid = ct.id wo ct.name =?]

fehler und in indexservice.java ich habe import goods.cat unbenutzt. Aber warum? Wenn ich Funktion schrieb, um goods.prod zu verwenden, das goods.cat importiert. Ok. Das war ohne Zuordnung. Ich füge diese in cat.java

**cat.java** 

package goods; 

import java.io.Serializable; 
import java.util.List; 
import java.util.ArrayList; 
import goods.prod; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.JoinTable; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

@Entity 
@Table(name="cat") 


public class cat implements Serializable { 

    private Integer id; 

     @Id @GeneratedValue 
     @Column(name="id") 
     @OneToMany 
     @JoinColumn(name="catid", referencedColumnName="id") 
     private List<prod> prods; 

    private static final long serialVersionUID = -4147058093508047162L; 

    private String Name; 

    public cat() { 
    } 

    public cat(int id, String Name) { 
     this.id = id; 
     this.Name = Name; 
    } 


    public Integer getId() { 
     return id; 
    } 

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

    public String getName() { 
     return Name; 
    } 
    public void setName(String Name) { 
     this.Name = Name; 
    } 

    } 

prod.java

package goods; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.JoinColumns; 
import javax.persistence.ManyToOne; 
import javax.persistence.OneToMany; 
import javax.persistence.OneToOne; 
import javax.persistence.Table; 
import goods.cat; 

import java.io.Serializable; 


@Entity 
@Table(name = "prod") 

public class prod implements Serializable { 
    @Id @GeneratedValue 
    @Column(name = "catid") 

    private Long id; 

    private Integer catid; 

    private String name; 
    private Integer price; 


    public prod() { 
    } 

    public prod(Long id, Integer catid, String name, Integer price) { 
     this.id = id; 
     this.catid = catid; 
     this.name = name ; 
     this.price = price; 
    } 

    public Long getid() { 
     return id; 
    } 

    public void setid(Long id) { 
     this.id = id; 
    } 

    public Integer getcatid() { 
     return catid; 
    } 
    public void setcatid(Integer catid) { 
     this.catid = catid; 
    } 

    public String getname() { 
     return name; 
    }  
    public void setname(String name) { 
     this.name = name; 
    } 

    public Integer getprice() { 
     return price; 
    } 
    public void setprice(Integer price) { 
     this.price = price; 
    } 

    } 

IndexService.java

import goods.prod; 
import goods.cat; 
@SuppressWarnings("unchecked") 
    public static ArrayList<prod> getListOfProds(String catname,String name,Integer pricel, Integer priceh){ 
     ArrayList<prod> list = new ArrayList<prod>(); 
     Session session = HibernateUtil.openSession(); 
     Transaction tx = null;   
     try { 
      tx = session.getTransaction(); 
      tx.begin(); 
      Query query = session.createQuery("from prod pr join pr.cat ct with pr.catid=ct.id where ct.name=?"); 
      //Query query = session.createQuery("from prod pr join pr.cat ct with pr.catid=ct.id where ct.name=?"); 
      query.setString(0, catname); 
      //query.setInteger(1, pricel); 
      //query.setInteger(2, priceh); 
      list = (ArrayList<prod>) query.list(); 

      tx.commit(); 
     } catch (Exception e) { 
      if (tx != null) { 
       tx.rollback(); 
      } 
      e.printStackTrace(); 
     } finally { 
      session.close(); 
     } 
     return list; 
    } 

Antwort

1

In Ihrem prod Klasse (definiert in prod.java) Sie haben nicht eine Feldkatze zugeordnet (als Objekttyp cat), auf die Sie gemappt haben ly catId als Ganzzahl.

Sie können also keine Verknüpfung wie Ihre verwenden.

Sie können neu schreiben Sie Ihre Abfrage wie folgt:

FROM prod pr, cat ct 
WHERE pr.catid = ct.id 
AND ct.name = ? 
+0

Danke, aber wie kann ich Objekt Katze zuordnen? cat wird nicht zugeordnet [FROM goods.prod pr, cat ct WHERE pr.catid = ct.id UND ct.name =?] – ifooi

+0

Anstelle von catId als Eigenschaft Ihrer Prod-Klasse verwenden Sie eine private Katze; –

+0

Wie kann ich anstelle von catid verwenden, wenn ich dies in db habe? Ich entferne catid und Setter/Getter und ändere es in private Katze Katze/ich bekomme Unbekannte Spalte 'prod0_.cat' in 'Feldliste' – ifooi

0
public class prod implements Serializable { 

@Id @GeneratedValue 
@Column(name = "cat") 
//private Integer catid; 
private Long id; 
private cat cat; 

Wiederholte Spalte in Zuordnung für Einheit: goods.prod Spalte: Katze (sollte mit Insert = "false" zugeordnet werden update = "false") Interessant. Wie kann ich das Wiederholen ausschließen? Aber ich kann ORM Struktur nicht sehen. Natürlich habe ich 2 ID in der Katze und prod. Aber ich weiß nicht, was ich wiederhole. oder

@Id @GeneratedValue 
private Long id; 
@Column(name = "cat.id") 
//private Integer catid; 
private cat cat; Unknown column 'prod0_.cat.id' in 'field list' 

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown Spalte 'prod0_.cat.id' in 'field list'

Und was soll ich Dow mit öffentlicher Klasse? sollte ich Katze hinzufügen? public prod (Lange ID, Integer catid, Stringname, Ganzzahlpreis) { this.id = id; // this.catid = catid; this.name = Name; dies.Preis = Preis; }

Ich habe keinen Bezugspunkt in diesem ORM. Wenn ich cat in prod einbeziehe, können Konstruktionen wie prod.cat varaint sein. Ich möchte das auflösen.

+0

@Column (name = "cat.id") geht nach Lange ID und vor Katze; –

+0

@Joe Taras dasselbe Ergebnis – ifooi

0

manytoone eine andere Variante

public class prod implementiert Serializable {

@Id @GeneratedValue 
@Column(name = "catid") 
@ManyToOne 
    @JoinColumn(name="cat", referencedColumnName="id") 
// private Integer catid; 
private Long id; 
private cat cat; 
private String name; 
private Integer price; 

@Column (n) nicht auf einem @ManyToOne Eigenschaft erlaubt: goods.prod.id