【问题标题】:read specific columns in a object format in hibernate在休眠中以对象格式读取特定列
【发布时间】:2014-04-02 10:02:40
【问题描述】:

我必须阅读 hibernate 中的一些特定列。我写过这样的方法

Branch getBranch(long branchId)
{
    String query = "select distinct bran.branch.branchId,bran.branch.branchName from Location bran where bran.branch.branchId =:branchId";
    Session session = getSession();
    session.beginTransaction();
    Query buildQuery =  getSession().createQuery(query).setParameter("branchId", branchId);
    List<Object[]> countryList = buildQuery.list();
    Branch branch = null;
    for(Object[] obj : countryList)
    {
        branch  = new Branch((Long)obj[0] , (String)obj[1]);
    }
    session.close();
    return branch;
}

但在这里我必须手动构造我不想要的对象。我想以对象形式阅读结果,我不想手动构建对象。我的实体是这样的

public final class Location  implements Comparable<Location>{

    @Id
    @Column(name = Tables.LOCATION.LOCATION_ID, nullable = false, precision = 15, scale = 0, updatable = false, insertable = false)
    private long locationId;

    @Column(name = Tables.LOCATION.LOCATION_NAME, length = 60, updatable = false, insertable = false)
    private String locationName;

    @Embedded
    private Country country;

    @Embedded
    private Branch branch;

分支不映射到实体,但它是可嵌入的。我想以 DTO 的形式读取数据,所以我已经完成了 ResultTransformer 类,但它只适用于 sqlQuery 而不是 HQL(如果我错了,请纠正我)。我无法更改我的查询。请帮助我

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    Hibernate 可以通过在 HQL 中使用 new 关键字 (called dynamic instantiation/constructor expression) 为您做到这一点:

    只需将您的查询更改为:

    select new your.package.name.Branch(bran.branch.branchId,bran.branch.branchName) from Location bran where bran.branch.branchId =:branchId
    

    【讨论】:

    • 感谢 Aleksander ..它工作正常,但让我知道即使我从同一个包中调用 package.className 也总是需要它因为以前尝试过这种方式,但当我使用它时它不起作用单独的类名。
    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 2016-08-25
    • 2013-02-11
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多