JPQL将参数绑定到ID

时间:2013-07-17 15:12:45

标签: hibernate jpa

我这里有一个似乎很愚蠢的问题。

我有一个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。

感谢。

1 个答案:

答案 0 :(得分:1)

是的,您必须将参数绑定到Card实例。但还有其他方法可以解决这个问题:

  1. 将查询重写为

    select c from CardUser c left join c.cards cc where cc.id = :cardId
    
  2. 保持查询不变,但使用EntityManager.getReference()代替使用EntityManager.find()获取具有此ID的卡。 getReference()返回未初始化的代理,但不查询数据库。

  3. 不要写任何查询,并使用

    Card card = em.find(Card.class, cardId);
    CardUser user = card.getUser();