当前位置: 首页 > 知识库问答 >
问题:

如何使用左联接创建JPA NamedQuery

萧嘉禧
2023-03-14
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
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;

汽车实体

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;

保留实体

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;

非常感谢你的帮助。

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;

共有1个答案

司空元凯
2023-03-14
SELECT c FROM Car c LEFT JOIN c.reservation r WHERE c.producer=:producer "
        + "AND c.type=:type AND c.dailyPrice=:dailyPrice

此查询中有一个错误C.reservation需要更改为C.reservation

我想展示空订的车。

你不能这样做。尝试从以下查询开始:

select c from Car c where not exists (
    select r.id from Reservation r where r.car.id = c.id
)
 类似资料:
  • 我用@query创建了UsersRepository 我得到错误,我可以在没有@query的情况下这样做吗?我可以用@onetomany做这个吗?如何在Jpa OneTomany上实现select?我想得到没有帖子的所有用户。

  • 那么如何将此更改为jpql查询代码呢?谢谢

  • 问题内容: 让我们假设以下内容: 表A 我有一个ID列表(10、11、12、13、14),可用于在此表中查找ID。这个ID清单是在我的前端生成的。 使用纯SQL,我需要从此列表(10、11、12、13、14)中选择ID,这些ID在表A中没有条目(在“ id”列中联接)。结果应该是id的13和14的结果集。 如何仅使用SQL完成此操作?(此外,如果可能,我想避免使用存储过程) 我能想到的唯一方法是,

  • 问题内容: 我不了解左外部联接,右外部联接的概念,或者根本不理解为什么我们需要使用联接!我正在努力解决的问题以及正在处理的表格在这里:链接 问题3(b) 在SQL中构造命令以解决以下查询,解释了为什么必须使用(外部)联接方法。[5分]“找到每名工作人员及其his属(如果有)的姓名” 问题3(c)- 使用(i)join方法和(ii)子查询方法在SQL中构造命令以解决以下查询。[10分]“查找在计算机

  • 问题内容: 这个问题已经在这里有了答案 : SQL Server中的LEFT JOIN与LEFT OUTER JOIN (12个答案) 5年前关闭。 之间有什么区别? 问题答案: 在MySQL中,它们是同一回事。A 是的同义词或缩写。

  • 问题内容: 我需要模拟左联接效果而不使用“左联接”键。 我有两个表,A和B,都带有和列。我想在两个表中都选择所有dbid,其中A中的名称等于B中的名称。 我使用它来进行同步,因此B开头是空的(所以我将使用A的id和B的id为null的对)。稍后,我将混合使用值-value和值-null的夫妇。 通常是: 问题是我无法使用,并且想知道是否/如何做同样的事情。 问题答案: 您可以使用这种方法,但是必须