2012-06-09 59 views
0

我有两个JPA连接的实体,Game和GameScore。如果玩家加入游戏,则为他制作新的GameScore。但是我需要获得不加入玩家的游戏(没有GameScore)。我该怎么做?我尝试了NamedQueries和CriteraBulder,但没有结果。跨2个实体搜索JPA

游戏endity:

package prayForHunt.model; 

import java.io.Serializable; 
import java.util.Date; 
import java.util.List; 
import javax.persistence.*; 
@Entity 
@NamedQueries({ 
@NamedQuery(name = Game.Q_GET_ALL_GAMES, query = "SELECT c FROM Game c"), 
}) 
    public class Game implements Serializable { 

//-------------------------------------------- 
@Id 
@GeneratedValue 
private int gameId; 
//--------------------------------------------  
@OneToMany(cascade = CascadeType.ALL, mappedBy = "game") 
private List<GameScore> gameScore; 
} 

GameScore实体

package prayForHunt.model; 

import java.io.Serializable; 
import java.util.List; 
import javax.persistence.*; 
import javax.persistence.metamodel.SingularAttribute; 

@Entity 
@NamedQueries(
@NamedQuery(name = GameScore.Q_GET_ALL_GAMESCORE, query = "SELECT c FROM GameScore c") 
) 
public class GameScore implements Serializable { 

@Id 
@GeneratedValue 
private int gameId; 
@ManyToOne 
protected Game game; 
@ManyToOne 
protected Player player; 

} 

回答

0

那么,什么是需要的结果是所有的游戏实体,其中在gameScore 为空这样的实例。 JPQL查询获取游戏没有得分(也可以命名查询使用):

SELECT g FROM Game g WHERE g.gameScore IS EMPTY 

等效条件查询如下:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Game> cq = cb.createQuery(Game.class); 
Root<Game> member = cq.from(Game.class); 
cq.select(member) 
    .where(cb.isEmpty(member.<Collection>get("gameScore")));   
em.createQuery(cq).getResultList();