最近做个简单的登录demo,发现总是报错,如下:
1. org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2235)
原因是调用了sessionFactory.getCurrentSession().createSQLQuery(hql); 因为入参是hql语句,而不是原生的sql语句。
另外:
hibernate 中createQuery与createSQLQuery两者区别是:
前者用的hql语句进行查询,后者可以用sql语句查询
前者以hibernate生成的Bean为对象装入list返回
后者则是以对象数组进行存储
所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便
突然发现createSQLQuery有这样一个方法可以直接转换对象
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
XXXXXXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。
2. java.lang.IllegalArgumentException: Parameter username does not exist as a named parameter in [from User u where u.username=?]
at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:380)
at org.hibernate.impl.AbstractQueryImpl.setInteger(AbstractQueryImpl.java:632)
原因:
调用代码:
String hql="from User u where u.username=?";
try
{
Query query=sessionFactory.getCurrentSession().createQuery(hql);
query.setInteger("username", Integer.parseInt(username));
List list=query.list();
因为query.setInteger的参数username虽然在数据库列有存在,但在hql语句里,username没设定,修改如下:
<pre name="code" class="java">String hql="from User u where u.username=:<strong>uname</strong>";
try
{
Query query=sessionFactory.getCurrentSession().createQuery(hql);
query.setInteger("<strong>uname</strong>", Integer.parseInt(username));
List list=query.list();
问题解决。
未完....