记录使用hibernate时遇到的问题

原创 2015年11月18日 16:40:39

记录hibernate中的一些问题

使用entityManager.createNativeQuery()

在使用entityManager.createNativeQuery()时创建的是原始sql,该方法有2个重载:

  • 第一个直接传入原生sql语句:
 public Query createNativeQuery(String sqlString) {
        this.checkOpen();

        try {
            SQLQuery he = this.internalGetSession().createSQLQuery(sqlString);
            return new QueryImpl(he, this);
        } catch (RuntimeException var3) {
            throw this.convert(var3);
        }
    }
  • 第二个传入原生sql和需要映射的实体类:
    public Query createNativeQuery(String sqlString, Class resultClass) {
        this.checkOpen();

        try {
            SQLQuery he = this.internalGetSession().createSQLQuery(sqlString);
            he.addEntity("alias1", resultClass.getName(), LockMode.READ);
            return new QueryImpl(he, this);
        } catch (RuntimeException var4) {
            throw this.convert(var4);
        }
    }

我看到这两个方法的时候发现,如果使用原生sql可以直接映射到Entity了,不用在这么麻烦的使用

List<Object[]>

来接收然后在痛苦的:

 for (Object[] obj : retList) {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("XXX", obj[0]);
            map.put("XXXX", obj[1]);
            map.put("XXXX", obj[2]);
            list.add(map);

返回需要的结果了.

问题

在使用Entity映射 新建了下面的Entity

public class User{
    private String id;
    private String loginName;
    private String password;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }


    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }


    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

开始执行:

entityManager.createNativeQuery(sql,User.class);

控制台就会报出:

Caused by: org.hibernate.MappingException: Unknown entity: xxx.xxx.xxx.xxx.User
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1096)
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.getSQLLoadable(SQLQueryReturnProcessor.java:374)
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processRootReturn(SQLQueryReturnProcessor.java:427)
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:394)
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:196)
    at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:88)
    at org.hibernate.engine.query.spi.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:69)
    at org.hibernate.engine.query.spi.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:249)
    at org.hibernate.internal.AbstractSessionImpl.getNativeSQLQueryPlan(AbstractSessionImpl.java:305)
    at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:311)
    at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:141)
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449)
    ... 17 more

大致意思是在映射的时候找不到该entity.

解决办法

为什么呢? 不是已经有entity了啊,为什么还提示找不到.
于是我在Entity上加上了@Entity注解

@Entity
public class User{

    @Id
    private String id;
    private String loginName;
    private String password;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }


    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }


    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

这样在执行就OK了.

  • 总结
    • 原来hibernate映射的时候还是需要根据注解或者xml配置文件来映射的.如果找到注解或者xml文件就会报出上面的错误.
    • 我误解了hibernate可以使用反射来自动映射entity和sql查询结果.

思考的问题

如果还需要加入注解或者xml文件的 使用原生sql查询和使用hql查询还有什么区别呢?
既然Entity和注解都写了 直接使用hql查询那不更方便么
谁可以帮忙解答一下这个问题?

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

记录使用hibernate时遇到的问题

记录hibernate中的一些问题 使用entityManagercreateNativeQuery 问题 解决办法 思考的问题记录hibernate中的一些问题使用entityManager.cre...

20160721遇到的问题

今天遇到三个问题:1.点击变现层JSP花时间过长;2.打开表现层后,数据层的值传不过来;3.点击出现404问题 对于1这个问题我的解决方法,首先看表现层的href传值。接着看数据SQL是否写的对。最后...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

slidingmenu 使用教程

现在直奔主题,首先要下载1.SlidingMenu开源项目下载地址: 1.https://github.com/jfeinstein10/slidingmenu中的SlidingMenu-mas...

编译时遇到的问题记录

BOOST_BUILD_PATH指定错误 BOOST_BUILD_PATH为Boost.Build根目录的绝对路径,bjam运行是会查找该绝对路径下的一些文件。在下载得到源代码解压之后,源码目录 R...

VS2010更改项目文件夹名称

经常遇到在原有项目的基础上做改动的情况,这个时候经常要更改项目名称. 如果改名后报错 就需要做下面的检查. 用记事本打开sln文件,看看启动配置是否对应,修改sln文件中的项目路径...

Android路上踩到的坑ing

1. WebView不断的刷新导致内存不足,闪退     问题:用WebView加载一个h5页面去抢购功能,不断点击右上角刷新按钮加载WebView闪退      解决方案:在WebView的onD...

iOS 8与xcode6的变化 总结

今天给朋友解决问题的时候 发现iOS 8和xcode6 和 以前的版本有许多不同,大神的目前的总结如下:  http://www.cocoachina.com/ios/20141218/10...

struts2跳转后CSS和js失效的问题

在使用struts2的action执行后跳转到的jsp显示的时候其中的css不起作用,就拿我现在出问题的project为例: action如下: /users/userList.jsp (注:l...

第一次接触Weblogic遇到的问题

安装步骤、发布服务不周网上资料满天飞,不再介绍、总结。 WebLogic10下载地址:http://yunpan.cn/cKNXYvDtqG233  访问密码 6f1c 问题一:启动Start Adm...

使用Myelipse编写hibernate遇到的各种问题

1.建立过程中的问题Question1:myeclipse如何自动生成Hibernate的实体类和映射文件(就是hbm.xml文件) 在MyEclipse工作区右上角选择进入MyEclips...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)