简单的Hibernate aliasToBean()不起作用

Sha*_*lle 5 hibernate

以下代码对我不起作用:

List results = getSession().createCriteria(User.class)
    .setProjection(Projections.projectionList()
            .add(Projections.property("userName"))
    )
    .setResultTransformer(Transformers.aliasToBean(UserSummary.class))
    .list();
Run Code Online (Sandbox Code Playgroud)


有趣的是,如果我删除了setResultTransformer()我得到的用户名列表返回完全没问题.

这是我的UserSummary类:

public class UserSummary {

    private String userName;
    private String clickUrl;
    private Integer id;

    public UserSummary() {}

    public UserSummary(Integer id, String userName) {
        this.id = id;
        this.userName = userName;
        this.clickUrl = clickUrl;
    }

    public String getUserName() {
        return userName;
    }

    public String getClickUrl() {
        return clickUrl;
    }

    public void setClickUrl(String clickUrl) {
        this.clickUrl = clickUrl;
    }

    public Integer getId() {
        return id;
    }
}
Run Code Online (Sandbox Code Playgroud)


思考?

Sha*_*lle 9

固定它.

不得不改变我的投影,所以看起来像这样..

.add(Projections.property("userName"), "userName")
Run Code Online (Sandbox Code Playgroud)

奇怪......但是无论有什么用,我猜.


小智 5

.add(Projections.property("userName"), "userName");
Run Code Online (Sandbox Code Playgroud)

.. 在这种情况下是正确的.

该aliasToBean()方法创建一个ResultTransformer,它将通过属性方法或字段将别名值注入UserSummary类的实例.方法的第二个参数是指定add()了投影属性别名的位置.在这里,您指定了'userName',它是UserSummary类中投影属性将映射到的属性.这就是为什么它在第一时间不起作用的原因.Hibernate lib不知道用于映射属性的UserSummary字段/ setter是什么.取出aliasToBean()方法,它不会尝试进行任何映射.所以,如果有人:

private String userFullName;

public UserSummary(Integer id, String userFullName) {
   this.id = id;
   this.userFullName = userFullName;
   this.clickUrl = clickUrl;
}

public String getUserFullName() {
   return userFullName;
}
Run Code Online (Sandbox Code Playgroud)

的add()方法将是如下:

.add(Projections.property("userName"), "userFullName");
Run Code Online (Sandbox Code Playgroud)

只要User类的userName和UserSummary类的userFullName都使用相同的类型,就可以了.