【发布时间】:2014-06-13 08:19:41
【问题描述】:
现在这很令人困惑...我有一个 JPA 实体 Order 引用了一个实体 User。用户可以是订单的买家或卖家。
因为买家和卖家都可以为订单输入额外信息,所以我将其移至额外的实体 OrderUserData。可能有也可能没有对应的 OrderUserData 对象,但如果存在,用户应该只能看到他们创建的条目(基于 USER_ID),而不是另一方的条目。
实体如下所示:
@Entity
@Table(name = "T_ORDER")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "SELLER_ID")
private User seller;
@ManyToOne
@JoinColumn(name = "BUYER_ID")
private User buyer;
@OneToMany(mappedBy = "order", fetch = FetchType.EAGER)
private List<OrderUserData> userData = new ArrayList<>();
//..
}
--
@Entity
@Table(name = "T_ORDER_USERDATA")
public class OrderUserData {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "ORDER_ID")
private Order order;
@ManyToOne
@JoinColumn(name = "USER_ID")
private User user;
private String comment;
//...
}
(User 不是很精彩,只是 ID 和基本名称字段)
现在当我尝试选择合适的数据显示在网站上时,我遇到了一个问题:
String qry = "SELECT o FROM Order o LEFT JOIN o.userData ud "
+ " WHERE (o.seller.id = :userId OR o.buyer.id = :userId)"
+ " AND ( ud.user IS NULL OR ud.user.id = :userId )";
TypedQuery<Order> query = em.createQuery(qry, Order.class);
query.setParameter("userId", userId);
假设我执行此操作,将 userId 设置为 2:
我的数据库如下所示:
ORDER
=====
ID SELLER_ID BUYER_ID
1 1 2
2 2 3
3 3 1
ORDER_USERDATA
===============
ID ORDER_ID USER_ID COMMENT
1 1 1 Comment that only user 1 should see
2 1 2 Comment that only user 2 should see
但与您预期的不同,在执行上述查询时,两条记录都包含在userData 列表中!似乎 JPA 正在执行两个查询(尽管 EAGER 获取)并忽略了第二个查询的 WHERE。这是为什么?除了循环遍历 Java 级别的 userData 列表并踢出相应用户不应该看到的条目之外,还有什么其他解决方案?
【问题讨论】:
标签: java jakarta-ee jpa eclipselink