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现在我没有错误,但结果中没有记录@jbnisetorderID=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
。