# Fehler bei SQL Abfrage MAX



## EJB3.0User (6. Aug 2010)

Hallo ich bekommen folgenden Fehler wenn ich versuche diese Abfrage zu starten :


```
java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: wa_pos is not mapped [SELECT MAX(schein_nr) FROM wa_pos]
```


```
Query query = manager.createQuery("SELECT MAX(schein_nr) FROM wa_pos");
        @SuppressWarnings("unchecked")
        Long result = Long.parseLong(query.getSingleResult().toString());
        return result+1;
```


Danke


----------



## mvitz (6. Aug 2010)

Auf welche Entity soll sich denn wa_pos beziehen?


----------



## EJB3.0Anfänger (6. Aug 2010)

ok, hab ein abbild gemacht von der Tabelle die Entity heißt :

WaPos  


```
Query query = manager.createQuery("SELECT * FROM wa_kopf");
        @SuppressWarnings("unchecked")
        List<WaKopf> kopf = query.getResultList();
        long retVal = 0;
        for(WaKopf _kopf : kopf){
        	if(retVal < _kopf.getPk().getScheinNr()){
        	   retVal = _kopf.getPk().getScheinNr();
        	}
        	
        }
        return retVal;
```


```
unexpected token: * near line 1, column 8 [SELECT * FROM wa_kopf]
```

ich versteh EJB 3.0 noch nicht ganz (Azubi  )


----------



## mvitz (6. Aug 2010)

Also du müsstest uns auf jeden Fall noch die Klasse WaKopf posten.


----------



## EJB3.0Anfänger (6. Aug 2010)

```
@Entity
@Table(name = "WA_KOPF")
public class WaKopf implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private Pk pk;

    @Column(name = "BUCHUNGSSCHLUESSEL")
    private String buchungsSchluessel;

    @Column(name = "TEXT")
    private String text;

    @Column(name = "BEARB_DATUM")
    @Temporal(TemporalType.TIMESTAMP)
    private Date bearbDatum;

    @Column(name = "BEARB_BENUTZER")
    private String bearbBenutzer;

    @Column(name = "GESELLSCHAFT")
    private Long gesellschaft;

    @Column(name = "KD_NR")
    private Long kdNr;

    @Column(name = "MDEFT")
    private Long mdeft;
    
    public WaKopf() {
    }
    
    public Pk getPk() {
        return pk;
    }

    public void setPk(Pk pk) {
        this.pk = pk;
    }

    public String getBuchungsSchluessel() {
        return buchungsSchluessel;
    }

    public void setBuchungsSchluessel(String buchungsSchluessel) {
        this.buchungsSchluessel = buchungsSchluessel;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public Date getBearbDatum() {
        return bearbDatum;
    }

    public void setBearbDatum(Date bearbDatum) {
        this.bearbDatum = bearbDatum;
    }

    public String getBearbBenutzer() {
        return bearbBenutzer;
    }

    public void setBearbBenutzer(String bearbBenutzer) {
        this.bearbBenutzer = bearbBenutzer;
    }

    public Long getGesellschaft() {
        return gesellschaft;
    }

    public void setGesellschaft(Long gesellschaft) {
        this.gesellschaft = gesellschaft;
    }

    public Long getKdNr() {
        return kdNr;
    }

    public void setKdNr(Long kdNr) {
        this.kdNr = kdNr;
    }

    public Long getMdeft() {
        return mdeft;
    }

    public void setMdeft(Long mdeft) {
        this.mdeft = mdeft;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((pk == null) ? 0 : pk.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        WaKopf other = (WaKopf) obj;
        if (pk == null) {
            if (other.pk != null)
                return false;
        } else if (!pk.equals(other.pk))
            return false;
        return true;
    }



    @Embeddable
    public static class Pk implements Serializable {
        private static final long serialVersionUID = 1L;

        @Column(name = "MANDANT")
        private Long mandant;

        @Column(name = "SCHEIN_NR")
        private Long scheinNr;

        public Pk() {
        }

        public Long getMandant() {
            return mandant;
        }

        public void setMandant(Long mandant) {
            this.mandant = mandant;
        }

        public Long getScheinNr() {
            return scheinNr;
        }

        public void setScheinNr(Long scheinNr) {
            this.scheinNr = scheinNr;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((mandant == null) ? 0 : mandant.hashCode());
            result = prime * result + ((scheinNr == null) ? 0 : scheinNr.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Pk other = (Pk) obj;
            if (mandant == null) {
                if (other.mandant != null)
                    return false;
            } else if (!mandant.equals(other.mandant))
                return false;
            if (scheinNr == null) {
                if (other.scheinNr != null)
                    return false;
            } else if (!scheinNr.equals(other.scheinNr))
                return false;
            return true;
        }
    }

}
```

Danke für die Hilfe


----------



## SlaterB (6. Aug 2010)

"Select *" gibts in HQL nicht und du musst die Entity angeben, nicht die SQL-Tabelle,
gar keine Grundlagen bekannt?

Query query = manager.createQuery("FROM WaKopf");


----------



## EJB3.0Anfänger (6. Aug 2010)

mh ne .. eher nicht  , wenn ihr was zum nachlesen habt gerne 

hab das jetzt so...




```
org.hibernate.hql.ast.QuerySyntaxException: Wa_Kopf is not mapped [FROM Wa_Kopf]
```


```
Query query = manager.createQuery("FROM Wa_Kopf");
        @SuppressWarnings("unchecked")
        List<WaKopf> kopf = query.getResultList();
        long retVal = 0;
        for(WaKopf _kopf : kopf){
        	if(retVal < _kopf.getPk().getScheinNr()){
        	   retVal = _kopf.getPk().getScheinNr();
        	}
        }
        return retVal;
```


----------



## SlaterB (6. Aug 2010)

ich sage dir vor
> Query query = manager.createQuery("FROM WaKopf"); 
und erzähle dir im Text haargenau "du musst die Entity angeben, nicht die SQL-Tabelle"

und du schreibst immer noch
> Query query = manager.createQuery("FROM Wa_Kopf");
und wunderst dich über die Exception?
Respekt, das muss man erstmal hinbekommen


----------



## EJB3.0Anfänger (6. Aug 2010)

ja Wa_Kopf heißt auch meine Entity...  hea?!


----------



## mvitz (6. Aug 2010)

Nein, deine Entity heißt, standardmäßig wie deine Klasse --> WaKopf
Diese Entity wird in der Tabelle (@Table) WA_KOPF gespeichert.

Da man mit dem Query createQuery die JPA Query Language (mir fällt gerade die korrekte Abkürzung nicht ein) benutzt, bezieht man sich hier auf Namen der Entities und nicht der Tabellen, in deinem Fall also WaKopf.

Edit: An deiner Stelle würde ich mal nach JPA Tutorials googlen und dir diese zu gemüte führen.


----------



## SlaterB (6. Aug 2010)

wonach richtet sich denn, wie eine Entiy heißt?
gut das mag Definitionsache sein, aber wenn ich schon explizit hinschreibe, dass es was anderes als der SQL-Tabellennamen sein soll
und wenn ich super-eindeutig sage, dass du "FROM WaKopf" als Query schreiben sollst, dann ist doch wohl mehr  als  sonnenklar,
dass ich als EntityName WaKopf ansehe, und wie auch immer diese nebensächliche Seitendiskussion ausgeht,
du musst "FROM WaKopf" schreiben

meine Güte


----------

