【发布时间】:2021-09-15 03:22:38
【问题描述】:
这是 2 个实体 Orders 和 Items,其中 Orders 与 Items 有 @OneToMany 映射和 Items 具有@ManyToOne 映射。我面临的问题是方法 findById(int 下面代码中提到的 theId,int itemId) 是返回 Item 表中的所有数据 而不是仅仅获取具有 itemId 的记录。
表 1
@Entity
@Table(name="orders")
public class Orders {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="order_id")
private int id;
@Column(name="order_date")
private String orderDate;
@Column(name="order_status")
private String orderStatus;
@OneToMany(mappedBy="order",cascade=
{CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
private List<Item> collectionOfItems;
public Orders() {
}
public Orders(String orderDate, String orderStatus) {
this.orderDate = orderDate;
this.orderStatus = orderStatus;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getOrderDate() {
return orderDate;
}
public void setOrderDate(String orderDate) {
this.orderDate = orderDate;
}
public String getOrderStatus() {
return orderStatus;
}
public void setOrderStatus(String orderStatus) {
this.orderStatus = orderStatus;
}
public List<Item> getCollectionOfItems() {
return collectionOfItems;
}
public void setCollectionOfItems(List<Item> collectionOfItems) {
this.collectionOfItems = collectionOfItems;
}
@Override
public String toString() {
return "Orders [id=" + id + ", orderDate=" + orderDate + ", orderStatus=" + orderStatus +
", collectionOfItems="
+ collectionOfItems + "]";
}
public void add(Item tempItem)
{
if(collectionOfItems==null)
{
collectionOfItems=new ArrayList();
}
collectionOfItems.add(tempItem);
tempItem.setOrder(this);
}
}
表 2
@Entity
@Table(name="item")
public class Item {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="item_id")
private int id;
@Column(name="item_name")
private String itemName;
@Column(name="item_unit_price")
private String itemUnitPrice;
@Column(name="item_quantity")
private String itemQuantity;
@JsonIgnore
@ManyToOne(cascade=
{CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
@JoinColumn(name="order_id")
private Orders order;
public Item() {
}
public Item(String itemName, String itemUnitPrice, String itemQuantity) {
this.itemName = itemName;
this.itemUnitPrice = itemUnitPrice;
this.itemQuantity = itemQuantity;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public String getItemUnitPrice() {
return itemUnitPrice;
}
public void setItemUnitPrice(String itemUnitPrice) {
this.itemUnitPrice = itemUnitPrice;
}
public String getItemQuantity() {
return itemQuantity;
}
public void setItemQuantity(String itemQuantity) {
this.itemQuantity = itemQuantity;
}
public Orders getOrder() {
return order;
}
public void setOrder(Orders order) {
this.order = order;
}
@Override
public String toString() {
return "Item [id=" + id + ", itemName=" + itemName + ", itemUnitPrice=" + itemUnitPrice +
", itemQuantity="
+ itemQuantity + "]";
}
}
OrderDAOImpl.java 中的方法
public Orders findById(int theId,int itemId) {
Session currentSession=entityManager.unwrap(Session.class);
Query<Orders> theQuery=currentSession.createQuery("select o from Orders o inner join
o.collectionOfItems c on o.id=c.id where o.id=:id and (c.id=:itemId)");
theQuery.setParameter("id", theId);
theQuery.setParameter("itemId", itemId);
System.out.println("the query "+theQuery.getQueryString());
Orders theOrder=(Orders)theQuery.getSingleResult();
return theOrder;
}
查询“select o from Orders o inner join o.collectionOfItems c on o.id=c.id where o.id=:id 并且 (c.id=:itemId) 将数据返回为
{
"id": 1,
"orderDate": "07-04-2021",
"orderStatus": "Dispatched",
"collectionOfItems": [
{
"itemName": "Book",
"itemUnitPrice": "100",
"itemQuantity": "5"
},
{
"itemName": "Pencil",
"itemUnitPrice": "10",
"itemQuantity": "7"
},
{
"itemName": "Eraser",
"itemUnitPrice": "10",
"itemQuantity": "7"
}
]
}
【问题讨论】:
标签: spring-boot hibernate jpa hql