【问题标题】:Hibernate criteria of Projection投影的休眠标准
【发布时间】:2015-07-17 18:08:06
【问题描述】:

我有 2 个具有 @OneToOne 关系的类:UserPlayer

用户包含一个玩家:

@Entity
@Table(name = "user")
public class User {
    @Column(name = "nickname")
    private String nickname;

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "id_player")
    private Player player;

   //getters and setters...
}

我只想用nicknameplayer 查询用户,用player 我不想要所有属性,我只想要2 个。

这就是我现在拥有的:

    //Projections for the class User
    ProjectionList projectionList = Projections.projectionList();
    projectionList.add(Projections.property("id"), "id");
    projectionList.add(Projections.property("nickname"), "nickname");
    projectionList.add(Projections.property("player"), "player");

    Criteria criteria = session.createCriteria(User.class);
    criteria.setFirstResult(player.getPvpRank() - 5);
    criteria.setMaxResults(11);
    criteria.createAlias("player", "p");
    criteria.addOrder(Order.asc("p.pvpRank"));
    criteria.setProjection(projectionList);
    criteria.setResultTransformer(Transformers.aliasToBean(User.class));

我只得到nicknameidplayer,但我怎样才能将投影设置到玩家只得到player.level 而不是所有属性?

【问题讨论】:

标签: java hibernate


【解决方案1】:

首先为 User 中的 JoinColumn 表 Player 创建别名 &然后在你的 projectionList 中引用它

Criteria criteria = session.createCriteria(User.class);
criteria.createAlias("player", "p");
projectionList.add(Projections.property("p.level"), "player");
...
criteria.setProjection(projectionList);
criteria.setResultTransformer(Transformers.aliasToBean(User.class));

希望对你有帮助。

【讨论】:

    【解决方案2】:

    它认为它完全按照你的建议:

    projectionList.add(Projections.property("player.level"), "player.level");
    

    【讨论】:

    • 我得到:could not resolve property: player.level of: model.User
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 2017-12-11
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 2014-10-30
    • 2011-11-27
    相关资源
    最近更新 更多