Hibernate HQL连接意外令牌

Hibernate HQL连接意外令牌,hibernate,hql,Hibernate,Hql,我有一些桌子: 订单(订单ID、订单日期、订单项(OneToMany)) OrderItem(id、订单(manyToOne)、书籍(manyToOne)) 书籍(id、标题、成本) 用户(id、用户名、密码、电子邮件) 我有orderID=42,我需要得到它的书籍信息和userId 以下是我的查询,以获取此表: from Order or inner join or.orderItems ori inner join ori.book where or.orderID=37 但这种错误会发生

我有一些桌子:

订单(订单ID、订单日期、订单项(OneToMany))

OrderItem(id、订单(manyToOne)、书籍(manyToOne))

书籍(id、标题、成本)

用户(id、用户名、密码、电子邮件)

我有
orderID=42
,我需要得到它的
书籍
信息和
userId

以下是我的查询,以获取此表:

from Order or inner join or.orderItems ori inner join ori.book where or.orderID=37
但这种错误会发生:

 unexpected token: or near line 1, column 26 [from com.obs.model.Order or inner join or.orderItems ori inner join ori.book where or.orderID=37]
更新

书籍
实体:

@Entity
public class Book implements Serializable {

    @Id
    @GeneratedValue
    private Integer id;
    @Column(nullable = false)
    private String title;
    @Column(nullable = false)
    private String author;
    @Column(nullable = false)
    private String isbn;
    private String description;
    @Column(nullable = false)
    private double cost;
@Entity
@Table(name = "orders")
public class Order implements Serializable {

@Id
@GeneratedValue
private Integer orderID;
@Column(nullable = false)
private Date orderDate;
@ManyToOne(cascade = CascadeType.ALL)
private User user;

@OneToMany(cascade = CascadeType.ALL)
private Set<OrderItem> orderItems = new HashSet<OrderItem>();
@Entity
public class OrderItem implements Serializable {

@Id
@GeneratedValue
private Integer id;

@ManyToOne(cascade = CascadeType.ALL)
private Order order; // F.K to Order table

@ManyToOne(cascade = CascadeType.ALL)
private Book book; // F.K to Book table

@Column(nullable = false)
private int quantity;
@Column(nullable = false)
private double totalPrice;
@Entity
public class User implements Serializable {

@Id
@GeneratedValue
private Integer id;
@Column(nullable = false)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String email;
订单
实体:

@Entity
public class Book implements Serializable {

    @Id
    @GeneratedValue
    private Integer id;
    @Column(nullable = false)
    private String title;
    @Column(nullable = false)
    private String author;
    @Column(nullable = false)
    private String isbn;
    private String description;
    @Column(nullable = false)
    private double cost;
@Entity
@Table(name = "orders")
public class Order implements Serializable {

@Id
@GeneratedValue
private Integer orderID;
@Column(nullable = false)
private Date orderDate;
@ManyToOne(cascade = CascadeType.ALL)
private User user;

@OneToMany(cascade = CascadeType.ALL)
private Set<OrderItem> orderItems = new HashSet<OrderItem>();
@Entity
public class OrderItem implements Serializable {

@Id
@GeneratedValue
private Integer id;

@ManyToOne(cascade = CascadeType.ALL)
private Order order; // F.K to Order table

@ManyToOne(cascade = CascadeType.ALL)
private Book book; // F.K to Book table

@Column(nullable = false)
private int quantity;
@Column(nullable = false)
private double totalPrice;
@Entity
public class User implements Serializable {

@Id
@GeneratedValue
private Integer id;
@Column(nullable = false)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String email;
用户
实体:

@Entity
public class Book implements Serializable {

    @Id
    @GeneratedValue
    private Integer id;
    @Column(nullable = false)
    private String title;
    @Column(nullable = false)
    private String author;
    @Column(nullable = false)
    private String isbn;
    private String description;
    @Column(nullable = false)
    private double cost;
@Entity
@Table(name = "orders")
public class Order implements Serializable {

@Id
@GeneratedValue
private Integer orderID;
@Column(nullable = false)
private Date orderDate;
@ManyToOne(cascade = CascadeType.ALL)
private User user;

@OneToMany(cascade = CascadeType.ALL)
private Set<OrderItem> orderItems = new HashSet<OrderItem>();
@Entity
public class OrderItem implements Serializable {

@Id
@GeneratedValue
private Integer id;

@ManyToOne(cascade = CascadeType.ALL)
private Order order; // F.K to Order table

@ManyToOne(cascade = CascadeType.ALL)
private Book book; // F.K to Book table

@Column(nullable = false)
private int quantity;
@Column(nullable = false)
private double totalPrice;
@Entity
public class User implements Serializable {

@Id
@GeneratedValue
private Integer id;
@Column(nullable = false)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String email;
订单项:

订单:

Book


订单和订单项之间的OneToMany双向关联不正确。事实上,你们有两个独立的协会。manytone使用order\u OrderID join列,而OneToMany使用您尚未显示的附加连接表

在双向关联中,一边总是另一边的反面。在一对多双向关联中,一侧必须是相反的一侧:

@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private Set<OrderItem> orderItems = new HashSet<OrderItem>();
@OneToMany(mappedBy=“order”,cascade=CascadeType.ALL)
private Set orderItems=new HashSet();

另外,请注意,在多通关联上使用CascadeType.ALL没有任何意义。删除OrderItem时,不希望删除OrderItem的帐簿。这无论如何都不行,因为其他订单项引用同一本书。

是保留字。不要选择
选择
。@JBNizet现在我没有错误,但结果中没有记录@jbniset
orderID=37
存在于
order
表中。您没有此订单的项目,或者这些项目都没有书籍。您的内部联接不希望筛选出没有项目和书籍的订单。@JBNizet在orderItem表中的
orderItem
中有一条记录,其
orderID=37
,并且有一本书的
bookid=5
。因此我应该将
ManyToOne
orderItem
删除到
order
,正确吗?否。您应该按顺序将orderItems字段声明替换为我答案中的代码。添加mappedBy属性使其成为OrderItem到Order.Ok之间的多工单关联的反面。现在额外的
order\u orderItem
表应该消失了,对吗?是的,它应该消失了。我真的建议您不要使用Hibernate来生成数据库模式。使用SQL(或FlywayDB或Liquibase)以您想要的方式生成它,然后使用Hibernate映射它。您的架构中不应该有您甚至不知道它们的用途的表。或者您也可以在一个查询中加载订单、其用户、其项目和其书籍:
选择不同于订单的o左连接获取o.user left join fetch o.orderItems项目left join fetch item.book其中o.id=:id