java persistence api, wie kann man Bedingungen ins Query mit aufnehmen

Florian Strienz

Erfahrenes Mitglied
Hallo zusammen,
ich habe mit Hilfe von Netbeans eine Web-Ansicht auf eine Datenbanktabelle erstellt. Dieses wurde mittels Java-Server-Faces und der Java persistence api gemacht. NetBeans erstellt ja genialer weise dann automatisch die Beans, Controler, Webseiten, etc... Echt spitze.

Jetzt habe ich ein Problem. Ich will nicht alle Datensätze aus der Tabelle anzeigen lassen. Genau gesagt will ich aus der Server Tabelle nicht die Datensätze anzeigen lassen die in der Spalte server_type_pk eine 7 steht. Hier der code, den mit Netbeans erzeugt hat.


Code:
public List<Server> getServers(boolean all) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Server as o");
            if (!all) {
                q.setMaxResults(batchSize);
                q.setFirstResult(getFirstItem());
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

Mein Versuch den Code so zu erweitern ist leider kläglich gescheitert.

Code:
Query q = em.createQuery("select object(o) from Server as o where not server_type_fk=7");

Das Objekt o ist mein Server Bean. Weiss jemand, wie ich das query korrekt definieren muss? Mit standard sql komme ich hier wohl leider nicht weiter.

Gruß&Danke
Flo
 
Du benutzt halt JPAQL. Die sieht in etwa so aus wie ExpressionLanguage, d.h. du definierst keine Spalten sondern Objektproperties. Wie heißt den den Property die den Servertyp speichert? o.serverType = ? oder ähnliches sollte funktionieren.

Gruß
Ollie
 
Hallo Oliever, danke für die Antwort.

Leider kriege ich es immer noch nicht hin. Ich habe folgendes probiert:

Code:
            Query q = em.createQuery("select object(o) from Server as o where o.serverTypeFk=:serverTypeFk");
            q.setParameter("serverTypeFk", 7);

Leider gibts immer noch diese exception.

Code:
java.lang.IllegalArgumentException: You have attempted to set a value of type class java.lang.Integer for parameter serverTypeFk with expected type of class entities.ServerType from query string select object(o) from Server as o where o.serverTypeFk=:serverTypeFk.

Hier noch mein Bean für die Tabelle
Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package entities;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

/**
 *
 * @author striefor
 */
@Entity
@Table(name = "server")
@NamedQueries({@NamedQuery(name = "Server.findByServerPk", query = "SELECT s FROM Server s WHERE s.serverPk = :serverPk"), @NamedQuery(name = "Server.findByName", query = "SELECT s FROM Server s WHERE s.name = :name"), @NamedQuery(name = "Server.findByArea", query = "SELECT s FROM Server s WHERE s.area = :area"), @NamedQuery(name = "Server.findByDomain", query = "SELECT s FROM Server s WHERE s.domain = :domain"), @NamedQuery(name = "Server.findByLocation", query = "SELECT s FROM Server s WHERE s.location = :location"), @NamedQuery(name = "Server.findByAppsShare", query = "SELECT s FROM Server s WHERE s.appsShare = :appsShare"), @NamedQuery(name = "Server.findByLocationCode", query = "SELECT s FROM Server s WHERE s.locationCode = :locationCode"), @NamedQuery(name = "Server.findByFacility", query = "SELECT s FROM Server s WHERE s.facility = :facility"), @NamedQuery(name = "Server.findByDfsShare", query = "SELECT s FROM Server s WHERE s.dfsShare = :dfsShare")})
public class Server implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "server_pk", nullable = false)
    private Integer serverPk;
    @Column(name = "name", nullable = false)
    private String name;
    @Column(name = "area", nullable = false)
    private String area;
    @Column(name = "domain", nullable = false)
    private String domain;
    @Column(name = "location", nullable = false)
    private String location;
    @Column(name = "apps_share", nullable = false)
    private String appsShare;
    @Column(name = "location_code", nullable = false)
    private String locationCode;
    @Column(name = "facility", nullable = false)
    private String facility;
    @Column(name = "dfs_share", nullable = false)
    private String dfsShare;
    @JoinColumn(name = "server_type_fk", referencedColumnName = "server_type_pk")
    @ManyToOne
    public ServerType serverTypeFk;

    public Server() {
    }

    public Server(Integer serverPk) {
        this.serverPk = serverPk;
    }

    public Server(Integer serverPk, String name, String area, String domain, String location, String appsShare, String locationCode, String facility, String dfsShare) {
        this.serverPk = serverPk;
        this.name = name;
        this.area = area;
        this.domain = domain;
        this.location = location;
        this.appsShare = appsShare;
        this.locationCode = locationCode;
        this.facility = facility;
        this.dfsShare = dfsShare;
    }

    public Integer getServerPk() {
        return serverPk;
    }

    public void setServerPk(Integer serverPk) {
        this.serverPk = serverPk;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public String getDomain() {
        return domain;
    }

    public void setDomain(String domain) {
        this.domain = domain;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getAppsShare() {
        return appsShare;
    }

    public void setAppsShare(String appsShare) {
        this.appsShare = appsShare;
    }

    public String getLocationCode() {
        return locationCode;
    }

    public void setLocationCode(String locationCode) {
        this.locationCode = locationCode;
    }

    public String getFacility() {
        return facility;
    }

    public void setFacility(String facility) {
        this.facility = facility;
    }

    public String getDfsShare() {
        return dfsShare;
    }

    public void setDfsShare(String dfsShare) {
        this.dfsShare = dfsShare;
    }

    public ServerType getServerTypeFk() {
        return serverTypeFk;
    }

    public void setServerTypeFk(ServerType serverTypeFk) {
        this.serverTypeFk = serverTypeFk;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (serverPk != null ? serverPk.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Server)) {
            return false;
        }
        Server other = (Server) object;
        if ((this.serverPk == null && other.serverPk != null) || (this.serverPk != null && !this.serverPk.equals(other.serverPk))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entities.Server[serverPk=" + serverPk + "]";
    }

}
 
Habs hingekriegt. Dein JPAQL Tipp hat mir weitergeholfen. :) Ich darf nicht auf den Wert in der Tabelle vergleichen, sondern, da es ja ein FK ist, muss ich ein Objekt von dem Bean der Tabelle des FK erzeugen und vergleichen. Dann geht es. :)

Vielen Dank!
 

Neue Beiträge

Zurück