0

我在这里有一个看似愚蠢的问题。

我有一个 CardUser 实体和一个 Card 实体,其中每张 Card 属于一个 CardUser 并且 CardUser 可以有多个 Card,都是简单的一对多关系。

然后我有一个查询来找出给定卡的用户是什么:

select c from CardUser c left join c.cards cc where cc = ?1

我有一个调用查询的方法:

public CardUser findUserByCard(Long cardId);

我的问题是:

我必须将 ?1 绑定到 Card 实例吗?我必须先用 cardId 获取 Card 实例,然后在查询中绑定它,这在实现中看起来很愚蠢。这是对数据库的双重访问,最后,数据库实际上只使用了 cardId。

谢谢。

4

1 回答 1

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();
    
于 2013-07-17T15:30:10.440 回答