现在的位置: 首页 > 综合 > 正文

Hibernate中createQuery与createSQLQuery两者的区别

2014年08月29日 ⁄ 综合 ⁄ 共 2047字 ⁄ 字号 评论关闭

最近几天在写项目,遇到了一个错:

Struts has detected an unhandled exception:
Messages:


ORA-00933: SQL ???????
could not execute query
could not execute query; SQL [ select count(*) from www.csdn.weibo.domain.Pictures where 1=1 and picture_type='aaa'];
nested exception is org.hibernate.exception.SQLGrammarException: could not execute query


File: oracle/jdbc/driver/DatabaseError.java
Line number: 112
Stacktraces
org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL [ select count(*) from www.csdn.weibo.domain.Pictures
where 1=1 and picture_type='aaa']; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query

在论坛发贴了,看到大家的回复我也改了改,还是没查询不到,于是乎请教老师吧,老师上来就看出问题了,唉唉,并且要我细看hibernate ,createQuery与createSQLQuery两者的区别,所以我先把我的错误展示给大家,然后再看他们的区别。

终于找到问题了 原来是把createQuery和createSQLQuery弄混了,在baseDaoImpl.java
里边我原来写的是

Java code

?

1
2
3
return

Integer.valueOf((session.createSQLQuery(
"
select count(*) from "

+ clazz.getName() +
"
"
+
whereSql).uniqueResult() +
""));


在jsp中拼接sql语句中写的是

Java code

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private

String spliceSql() {
String
whereSql =
"
where 1=1 "
;
if

(user !=
null

&& user.getId() !=
null

&& !
"".equals(user.getId()))
{
whereSql
+=
"
and user_id="

+ user.getId() +
"
"
;
}
if

(pictures !=
null

&& pictures.getType() !=
null
&&
!
"".equals(pictures.getType()))
{
whereSql
+=
"
and picture_type='"

+ pictures.getType() +
"'";
}
return

whereSql;
}



应该改为这样的,

Java code

?

1
2
3
4
return

Integer.valueOf(session.createQuery(
"select
count(alias) from "

+ clazz.getName()
+
"
as alias "
+whereSql).uniqueResult()
+
"");




Java code

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private

String spliceSql() {
String
whereSql =
"
where 1=1 "
;
if

(user !=
null

&& user.getId() !=
null

&& !
"".equals(user.getId()))
{
whereSql
+=
"
and user_id="

+ user.getId() +
"
"
;
}
if

(pictures !=
null

&& pictures.getType() !=
null
&&
!
"".equals(pictures.getType()))
{
whereSql
+=
"
and picture_type='"

+ pictures.getType() +
"'";
}
return

whereSql;
}

下面是从网上找的很有用:

createQuery与createSQLQuery区别

前者用的hql语句进行查询,后者可以用sql语句查询
前者以hibernate生成的Bean为对象装入list返回
后者则是以对象数组进行存储
所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便
突然发现createSQLQuery有这样一个方法可以直接转换对象
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
XXXXXXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。

抱歉!评论已关闭.