您的位置:首页 > 其它

记录使用hibernate时遇到的问题

2015-11-18 16:40 253 查看
记录hibernate中的一些问题
使用entityManagercreateNativeQuery
问题

解决办法

思考的问题

记录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.ja
4000
va: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