我这里有一个似乎很愚蠢的问题。
我有一个CardUser实体和一个卡实体,其中每张卡属于一个CardUser,而CardUser可以有多个卡,所有简单的1对多关系。
然后我有一个查询,找出给定卡的用户是什么:
select c from CardUser c left join c.cards cc where cc = ?1
我有一个方法来调用查询:
public CardUser findUserByCard(Long cardId);
我的问题是:
我是否必须将?1绑定到Card实例?在实现中看起来很傻,我必须首先使用cardId获取Card实例,然后在查询中绑定它。这是数据库的双重访问,最后,数据库实际上只接受了cardId。
感谢。
答案 0 :(得分:1)
是的,您必须将参数绑定到Card实例。但还有其他方法可以解决这个问题:
将查询重写为
select c from CardUser c left join c.cards cc where cc.id = :cardId
保持查询不变,但使用EntityManager.getReference()
代替使用EntityManager.find()
获取具有此ID的卡。 getReference()
返回未初始化的代理,但不查询数据库。
不要写任何查询,并使用
Card card = em.find(Card.class, cardId);
CardUser user = card.getUser();