代码之家  ›  专栏  ›  技术社区  ›  maurizeio

加入获取嵌套在@OneToMany中的@ManyToOne

  •  1
  • maurizeio  · 技术社区  · 10 年前

    我创建了以下实体来管理持久购物车:

    购物车.java:

    @Entity
    public class ShoppingCart {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @PrivateOwned
        @OneToMany(mappedBy = "cart", cascade = CascadeType.ALL)
        @OrderBy("creationTimestamp")
        private List<ShoppingCartItem> items;
    
        public ShoppingCart() {}
    
        // Getters and setters...
    }
    

    购物车项目.java:

    @Entity
    @IdClass(ShoppingCartItemId.class)
    public class ShoppingCartItem {
        @Id
        @ManyToOne
        private Item item;
    
        @Id
        @ManyToOne
        private ShoppingCart cart;
    
        private int quantity;
    
        @Column(precision = 17, scale = 2)
        private BigDecimal price;
    
        @Temporal(TemporalType.TIMESTAMP)
        private Date creationTimestamp;
    
        protected ShoppingCartItem() {}
    
        @PrePersist
        protected void prePersist() {
            creationTimestamp = new Date();
        }
    
        public ShoppingCartItem(ShoppingCart cart, Item item, int quantity) {
            this.cart = cart;
            this.item = item;
            this.quantity = quantity;
            this.price = item.getPrice();
        }
    
        // Getters and setters...
    }
    

    项目.java:

    @Entity
    public class Item {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @ManyToOne
        private Brand brand;
    
        private String model;
        private String variant;
        private String description;
    
        @Column(precision = 17, scale = 2)
        private BigDecimal price;
    
        private int availability;
    
        protected Item() {}
    
        // Constructors, getters and setters...
    }
    

    当我发出以下JPQL查询时:

    SELECT c FROM ShoppingCart c JOIN FETCH c.items WHERE c.id = :id
    

    我注意到所有 ShoppingCartItem s在同一个 ShoppingCart 按预期在单个查询中检索,但 @ManyToOne private Item item; 字段不在联接中,每个字段都有一个单独的查询 购物车项目 用于获取该字段 访问时 .

    使用EclipseLink,是否有一种方法也可以 Item 当连接/批处理提取 购物车项目 s如何更改查询和/或代码?

    2 回复  |  直到 10 年前
        1
  •  1
  •   Patrick Leitermann    10 年前

    如果您使用的是EclipseLink,您可以查看 @BatchFetch @JoinFetch 注释。

        2
  •  0
  •   maurizeio    10 年前

    left join fetch 带有别名的s似乎被忽略了,我发现了这样的查询提示:

    Query query = entityManager.createQuery("SELECT c FROM ShoppingCart c WHERE c.id = :id");
    query.setHint("eclipselink.left-join-fetch", "c.items.item.brand");
    

    这可能比注释方法更好,因为它可以在单个查询中指定。


    更新

    此提示的使用已中断 @OrderBy("creationTimestamp") 所以 ShoppingCartItem s不再按插入的顺序返回。这可能是由于EclipseLink中的一个错误,但我认为这并没有太大的伤害,因为我实际上只需要在向用户显示购物车时订购商品,而不是在用户登录时订购,匿名购物车中的商品必须转移到用户购物车。