【问题标题】:HQL mapping query with conditions on second entity not working具有第二个实体条件的 HQL 映射查询不起作用
【发布时间】: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


    【解决方案1】:

    这里有一些答案可以帮助你In Hibernate HQL, how do i filter the results of a joined Table parented to my main Table?Hibernate query to filter results from a nested object list

    您可以使用join fetch 以便过滤影响集合元素,但正如我在其他问题中指出的那样,这可能会导致不良副作用。

    【讨论】:

      猜你喜欢
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多