Wie erstellen JPA-NamedQuery mit LEFT JOIN

Habe ich zwei Entitäten: Auto und Reservierung. Ich möchte zu erstellen, die benannte Abfrage mit LEFT JOIN. Ich habe versucht, dies zu tun, wie es hier beschrieben wird Wie erstellen JPA-query mit LEFT OUTER JOIN aber es funktioniert nicht. Haben Sie eine Idee, was falsch ist in meiner Abfrage? Ich möchte zeigen Autos, die NULL-Reservierungen. Sowieso noch mit JOIN funktioniert es nicht. Nach dem Start der Anwendung habe ich einen Fehler:

Caused by: org.hibernate.HibernateException: Errors in named queries: Car.findAll
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:495) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
    ... 22 common frames omitted

Im Prinzip möchte ich erreichen dieser Abfrage, die in MySQL funktioniert

SELECT distinct * FROM car c LEFT JOIN reservation r ON c.id = r.car_id WHERE c.producer='producer' AND c.model='model' AND c.type='type' 
AND (r.date_of_rent < 'date1' AND r.date_of_return < 'date1') OR (r.date_of_rent > 'date2') OR r.date_of_rent IS NULL;

Auto Entität

import java.io.Serializable;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;

@Entity
@NamedQuery(name = "Car.findAll", query = "SELECT c FROM Car c LEFT JOIN c.reservation r WHERE c.producer=:producer "
        + "AND c.type=:type AND c.dailyPrice=:dailyPrice")
public class Car implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String producer;
    private String model;
    private int seatsNumber;
    private String type;
    private String registrationNumber;
    private double dailyPrice;
    private String description;
    @OneToMany(mappedBy = "car")
    private List<Reservation> reservations;

Reservierung Entität

import java.io.Serializable;
import java.sql.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Reservation implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToOne
    private User user;
    @ManyToOne
    private Car car;
    private Date dateOfRent;
    private Date dateOfReturn;

Vielen Dank für die Hilfe.

UPDATE

Problem gelöst. Die Abfrage sollte wie folgt Aussehen

import java.io.Serializable;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;

@Entity
@NamedQuery(name = "Car.findAll", query = "SELECT DISTINCT c FROM Car c LEFT JOIN c.reservations r WHERE "
        + "c.type=:type AND c.dailyPrice<=:dailyPrice AND ((r.dateOfRent < :dateOfRent AND r.dateOfReturn < :dateOfRent) OR "
        + "(r.dateOfRent > :dateOfReturn) OR (r.dateOfRent IS NULL))")
public class Car implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String producer;
    private String model;
    private Integer seatsNumber;
    private String type;
    private String registrationNumber;
    private Double dailyPrice;
    private String description;
    @OneToMany(mappedBy = "car")
    private List<Reservation> reservations;
  • Bitte fügen Sie zu der Frage: Warum brauchst du einen left join?
  • „es funktioniert nicht“ ? Was soll das bedeuten? Bekommen Sie eine Ausnahme? Es läuft einige SQL (, dass Sie nicht post), aber Sie bekommen ein anderes Ergebnis als das, was Sie erwarten? Gar nichts geschieht?
  • Ich gepostet, und Fehler, die ich mit dieser Abfrage und die Abfrage, die ich wouldlike zu erreichen.
  • Besser, fügen Sie den Teil der stack-trace mit einer Fehlerbeschreibung. Errors in named queries: Car.findAll nicht viel erzählen. Auch habe ich aktualisiert meine Antwort mit Fehler.
InformationsquelleAutor bartekms274 | 2017-05-14



One Reply
  1. 0
    SELECT c FROM Car c LEFT JOIN c.reservation r WHERE c.producer=:producer "
            + "AND c.type=:type AND c.dailyPrice=:dailyPrice

    Es ist ein Fehler in dieser Abfrage c.reservation müssen geändert werden, um c.reservations.

    Möchte ich zeigen Autos, die NULL-Reservierungen.

    Können Sie nicht tun es auf diese Weise. Versuchen Sie, beginnen Sie von dieser Abfrage:

    select c from Car c where not exists (
        select r.id from Reservation r where r.car.id = c.id
    )

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.