2014-10-31 60 views
0

我使用hibernate-core:3.3.1.GA为什么hibernate连接所有表,声明这个特定的连接?

我有三个映射:

PlayerAccount

@Entity 
@Table(name = "player_account") 
public class PlayerAccount { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private int id; 

    @ManyToOne(targetEntity = Player.class, fetch = FetchType.EAGER) 
    @JoinColumn(name="player_id") 
    private Player player; 

    //GET, SET 
} 

PlayerAchievements

@Entity 
@Table(name="player_achievement") 
public class PlayerAchievement { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private int id; 

    @ManyToOne(targetEntity = Player.class, fetch = FetchType.EAGER) 
    @JoinColumn(name = "player_id") 
    private Player player; 

    //GET, SET 
} 

和类Player

@Entity 
@Table(name = "player") 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Player { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private int id; 

    @Column(name = "ps_id") 
    private String psId; 

    @Column(name = "login") 
    private String login; 

    @Column(name = "password") 
    private String password; 

    @Column(name = "email") 
    private String email; 

    //GET, SET 
} 

问题: 当我尝试写一个简单的条件查询类似如下:

Criteria criteria = getSession().createCriteria(PlayerAccount.class); 
criteria.add(Restrictions.eq("playerId", playerId)); 
criteria.list(); 

生成的SQL查询中包含joins有以下几种观点:

SELECT 
-- columns to select 
FROM player_account this_ 
LEFT OUTER JOIN player player2_ 
ON this_.player_id=player2_.id 
LEFT OUTER JOIN external_partner_player player2_1_ 
ON player2_.id=player2_1_.player_id 
LEFT OUTER JOIN player_achievement achievemen3_ 
ON player2_.id=achievemen3_.player_id 
WHERE player_id = 2362189 

事情player_achievements可能包含多个具有相同player_id值的行。由于我们在该条件查询中可能有重复的结果。如何解决使用休眠而不写入sql - 查询?

+0

向我们显示您的external_partner_player表。你想要获取什么,PlayerAccount及其所有关联或只是PlayerAccount的属性? – 2014-10-31 14:46:43

回答

1

你需要做的SELECT DISTINCT,像这样:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);