【问题标题】:Hibernate result transformation from SQL view从 SQL 视图休眠结果转换
【发布时间】:2014-12-07 03:16:03
【问题描述】:

我创建了一个 SQL 视图,其中包含用户的所有属性和一个 "is_granted",这是一个布尔值,使用自定义 pl/sql 函数计算。在我的应用程序中,我需要创建本机 SQL 查询并将值映射到 DTO 对象。问题是,在转换过程中抛出异常并且查询失败。

考虑以下模型:

@Entity
@Table("quasar_user")
public class User{

    private long id;
    private String firstname;
    private String lastname;
    private User changedBy;
    // a lot of others properties ...
}


public class UserDto{
    private User user;
    private boolean granted;

    // getters setters
}

查询 - 将属性映射到 DTO

@SuppressWarnings("unchecked")
public List<UserDto> getGrantedUsers(final long userId){

    final String sql = 
            "SELECT u.* as user, u.is_granted as granted " + 
            "FROM user_view u " +
            "WHERE u.id= :userId ";

    return sessionFactory.getCurrentSession().createSQLQuery(sql)
        .addEntity("user", User.class)
        .addScalar("granted", StandardBasicTypes.BOOLEAN)
        .setLong("userId", userId)
        .setResultTransformer(Transformers.aliasToBean(UserDto.class))
        .list();

}

有人知道问题出在哪里吗?转型有问题吗?

堆栈跟踪

CustomMappingExceptionResolver:doResolveException(line 37) - java.lang.NullPointerException
at org.hibernate.loader.DefaultEntityAliases.intern(DefaultEntityAliases.java:193)
at org.hibernate.loader.DefaultEntityAliases.getSuffixedPropertyAliases(DefaultEntityAliases.java:151)
at org.hibernate.loader.DefaultEntityAliases.determinePropertyAliases(DefaultEntityAliases.java:93)
at org.hibernate.loader.DefaultEntityAliases.<init>(DefaultEntityAliases.java:65)
at org.hibernate.loader.ColumnEntityAliases.<init>(ColumnEntityAliases.java:43)
at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.generateCustomReturns(SQLQueryReturnProcessor.java:198)
at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:152)
at org.hibernate.engine.query.spi.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67)
at org.hibernate.engine.query.spi.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:197)
at org.hibernate.internal.AbstractSessionImpl.getNativeSQLQueryPlan(AbstractSessionImpl.java:226)
at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:232)
at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:157)
at cz.nlfnorm.quasar.dao.impl.UseDaoImpl.getGrantedUsers(UseDaoImpl.java:234)

【问题讨论】:

    标签: java hibernate hql hibernate-native-query


    【解决方案1】:

    我的 SQL 查询错误。修正后是:

    final String sql = 
            "SELECT {u.*}, u.is_granted as granted " + 
            "FROM user_view u " +
            "WHERE u.id= :userId ";
    

    更多详情请见:Table 16.1. Alias injection names

    【讨论】:

    • 哇,我看了一遍,这最终成为了解决方案。谢谢!另外,值得一提的是,直到我在目标实体上添加了@JoinColumnsOrFormulas 注释后,我才开始在 DefaultEntityAliases.java:193 处体验 NPE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多