记录使用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中常见的20个问题

1问:Hibernate初始化时总是报错:java.lang.NoClassDefFoundError 11问:为什么在向数据库中插入长字符串时候部分自动丢失 在向数据库中增加一条新的条目时,发现如果...
  • Arthur0088
  • Arthur0088
  • 2010年03月21日 19:17
  • 3079

新手使用hibernate遇到的问题(1)

上周初学hibernate,以下是遇到的一些问题和解决的方法,参考了其他一些前辈的方法经验,大多数是配置文件出的问题 1、Error parsing JNDI name [foo] 这个的原因是在...
  • m0_37082167
  • m0_37082167
  • 2017年09月03日 22:10
  • 157

【Java--工作记录】工作遇到的问题记录--更新中

1、简单排序问题:选择排序,中间变量k,双层循环 2、字符串判断为空,判断为null应该放在前面,判断为""放后面,不然会报空指针错误 3、 & 运算是,如果对应的两个bit都是1,则那个bit结果为...
  • a872728984
  • a872728984
  • 2015年04月02日 09:23
  • 205

记录自己学习心得以及工作中遇到问题的总结

第一次来这里写文章,以后会陆续更新其他文章。
  • xieming1601
  • xieming1601
  • 2016年09月10日 09:22
  • 203

使用activity中遇到的问题及解决办法

Activity写在前文的话,最近的项目里用到的基本上全是Activity,在使用的时候会出现很多小问题,在这里总结一下。方便以后自己掌握,同时希望也能帮助到需要帮助的人 我们都知道Activity是...
  • Good_Learning_IT
  • Good_Learning_IT
  • 2016年07月12日 21:32
  • 251

学习Hibernate碰到的问题以及解决问题的方法(长期更新)

星期一 2007年08月06日 学习Hibernate碰到的问题以及解决问题的方法(长期更新) 2007-8-6遇到的问题:1. Exception in thread "main" org.hibe...
  • rudyMatrix
  • rudyMatrix
  • 2007年11月18日 22:40
  • 2406

java开发中碰到的问题记录

积累的问题多了,就不怕问题来。 一,Eclipse配置问题 1.启动项目,内存溢出 Eclipse->Window->Preferences->Server->RuntimeEnvironments-...
  • lipp555
  • lipp555
  • 2016年01月14日 16:53
  • 862

matlab学习中遇到的问题整理

编程基础实在是很差,将最近在看matlab程序遇到的问题查资料,并整理如下: 一.Matlab输出输出参数varargout与nargout,varargin与nargin的区别(来自百度文库) 1、...
  • SMF0504
  • SMF0504
  • 2017年08月03日 14:06
  • 352

毕设项目期间遇到的问题记录

项目期间遇到的问题记录一下,方便查看 1、问题:MyEclipse启动tomcat时报错"A Configuration error occurred during startup."       ...
  • u013082989
  • u013082989
  • 2016年03月26日 14:13
  • 923

文件上传时候可能遇到的问题

1 .   上传的时候老提示  没有 临时目录 检查   php.ini     中的    upload_tmp_dir  是否打开了   没有则打开并设置好临时文件目录, 如果在Linu...
  • dengfei00100
  • dengfei00100
  • 2016年07月10日 23:41
  • 140
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:记录使用hibernate时遇到的问题
举报原因:
原因补充:

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