Die Verwendung von Coalesce-oder Case-Anweisung in JPA
Wie zu verwenden coalesce
oder case statement
in JPA 2 mit CriteriaBuilder
Für viele Datensätze initiatedBy leer, und als ein Ergebnis employeeName wird null für diese Datensätze. Ich möchte die Anzeige System Generiert wenn employeeName
ist null für die Projekte, in denen initiatedBy Mitarbeiter ist null in Datenbank-Tabelle.
Habe ich die folgenden Beziehungen in Entitäten
Projekt
@Entity
@Table(name = "PROJECT")
public class Project {
@Id
@Column(name = "PROJECTID")
private Long projectId;
....
....
@ManyToOne
@JoinColumn(name = "EMPLOYEENUMBER", referencedColumnName = "EMPLOYEENUMBER")
private Employee empNumber;
@ManyToOne
@JoinColumn(name = "INITIATEDBY", referencedColumnName = "EMPLOYEENUMBER")
private Employee initiatedBy;
Mitarbeiter
@Entity
@Table(name = "EMPLOYEES")
public class Employee {
@Id
@Column(name = "EMPLOYEENUMBER")
private String employeeNo;
@Column(name = "EMPLOYEENAME")
private String employeeName;
.....
.....
@OneToMany(mappedBy = "empNumber")
private Set<Project> employeeProject;
@OneToMany(mappedBy = "initiatedBy")
private Set<Project> employeeInitiatedBy;
.....
in DAOImpl Klasse, ich habe
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Project> c = cb.createQuery(Project.class);
Root<Project> emp = c.from(Project.class);
c.orderBy(cb.desc(emp.get("projectNo")));
c.select(emp);
TypedQuery<Project> q = entityManager.createQuery(c);
Ich habe versucht mit
Coalesce<String> coalesce = cb.coalesce();
coalesce.value(emp.<String>get("employeeName"));
coalesce.value("System Generated");
Jedoch wenn ich laufen, ich bin immer Ausnahme als
java.lang.IllegalArgumentException: Unable to resolve attribute
[employeeName] against path
Jede Hilfe zu diesem wird sehr spürbar.
InformationsquelleAutor Jåcob | 2013-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste problem ist, mögliche Missverständnisse in der Verwendung von JPA-Entitäten als ein query-Ergebnis. Wenn entities verwendet werden, die als Ergebnis der Abfrage, die Sie Spiegel Zustand der Datenbank. Ersetzen
Employee.empName
mit anderen Wert als einer in der Datenbank widerspricht.Bis zum gewissen Punkt, der erreicht werden kann, über CriteriaBuilder.konstruieren. Ergebnis-Objekte (auch Personen) erstellt werden über Konstruktor, müssen alle select-Elemente als argument. Leider nicht gut zusammen zu spielen, mit dem Objekt-graph (
Project
und angeschlossenEmployee
in diesem Fall).Zweite problem ist, dass im folgenden
get("employeeName")
heißt fürProject
, und es ist nicht so ein Attribut:Im Allgemeinen verschmelzen können wie folgt eingesetzt werden (aber wegen dem, was oben gesagt wurde, diese nicht allein lösen problem):
coalesce
istcoalesce.value(emp.<String>get("employeeName"));
?In diesem Fall nicht, weil in code gegeben, ungeachtet es den Namen emp bezieht sich nicht auf die Mitarbeiter. Es ist Root<Projekt> emp. Der Mitarbeiter hat employeeName Attribut-Projekt nicht. Ich will hinzufügen, Beispiel für verschmelzen-Nutzung zu beantworten.
Mikko, Was ich brauche, um zu beheben mein Problem?
InformationsquelleAutor Mikko Maunu