初学hibernate,简单地用了一下SSH2,出现一种难明的错误

用《开发者突击》里面的初步搭建SSH2的代码,连接sqlserver2005,出现下面提示:
Hibernate: select user0_.ID as ID, user0_.username as username0_, user0_.password as password0_, user0_.email as email0_ from user user0_ where user0_.username=?
WARN - SQL Error: 156, SQLState: S0001
ERROR - 关键字 'user' 附近有语法错误。
2010-12-28 22:22:11 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'user' 附近有语法错误。

数据库中我建了表 user,属性有id username password email。

applicationContext 代码如下:
[code="xml"]
<!-- 配置数据源 -->
class="org.apache.commons.dbcp.BasicDataSource">
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">

value="jdbc:sqlserver://localhost:1433;databaseName=DeviceManagement;">



<!-- 配置Hibernate -->
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
    <property name="mappingResources">
        <list>
            <value>com/demo/hibernate/beans/User.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">
                org.hibernate.dialect.SQLServerDialect
            </prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>


<!-- 配置事务 -->
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref local="sessionFactory" />
    </property>
</bean>


<!-- 定义DAO -->
<bean id="userDAO" class="com.demo.hibernate.dao.UserDAO">
    <property name="sessionFactory">
        <ref local="sessionFactory" />
    </property>
</bean>


<!-- 定义DAO代理 -->
<bean id="UserDAOProxy"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
        <ref bean="transactionManager" />
    </property>
    <property name="target">
        <ref local="userDAO" />
    </property>
    <property name="transactionAttributes">
        <props>
            <prop key="insert*">PROPAGATION_REQUIRED</prop>
            <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
        </props>
    </property>
</bean>


<!-- 定义Struts配置 -->
<bean name="loginAction"
    class="com.demo.struts2.actions.LoginAction">
    <property name="userDAO">
        <ref local="userDAO" />
    </property>
</bean>
<bean name="logoutAction"
    class="com.demo.struts2.actions.LogoutAction">
    <property name="userDAO">
        <ref local="userDAO" />
    </property>
</bean>
<bean name="registerAction"
    class="com.demo.struts2.actions.RegisterAction">
    <property name="userDAO">
        <ref local="userDAO" />
    </property>
</bean>


<!-- 配置拦截器 -->
<bean name="logger" class="com.demo.spring.aop.LoggingInterceptor" />

<!-- 配置拦截器代理 -->
<bean name="loggingAutoProxy"
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames">
        <list>
            <value>/login</value>
            <value>/register</value>
        </list>
    </property>
    <property name="interceptorNames">
        <list>
            <value>logger</value>
        </list>
    </property>
</bean>

[/code]

[size=x-large]提示错误行在UserDao里面,
[/size]UserDao
[code="java"]
package com.demo.hibernate.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.demo.hibernate.beans.User;

public class UserDAO extends HibernateDaoSupport implements IUserDAO {

// 验证用户名和密码
public boolean isValid(final String username, final String password) {
    System.out.println("UserDao检验是否有效");
    System.err.println("username:"+username+",password:"+password);
    List list = (List) getHibernateTemplate().execute(new HibernateCallback() {
        public Object doInHibernate(Session session)
                throws HibernateException {

/////////////////////////////////////这里报错///////////////////////////////
List result = session.createCriteria(User.class).add(
Restrictions.eq("username", username)).add(
Restrictions.eq("password", password)).list();
return result;
}
});
if (list.size() > 0) {
return true;
} else {
return false;
}
}
// 判断某个用户是否存在,只需用用户名查询就可以
public boolean isExist(final String username) {
System.err.println("UserDao进行查询");
List list = (List) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException {
List result = session.createCriteria(User.class).add(
Restrictions.eq("username", username)).list();
return result;
}
});
if (list.size() > 0) {
return true;
} else {
return false;
}
}
//插入新的用户对象到数据库
public void insertUser(User user) {
System.err.println("UserDao插入数据");
getHibernateTemplate().saveOrUpdate(user);
}
//从数据库中取得用户对象
public User getUser(String userid) {
System.err.println("UserDao取得对象");
return (User) getHibernateTemplate().get(User.class,
new Integer(userid));
}
//取得用户所有详细信息
public List getUsers() {
System.err.println("UserDao取得数据");
return getHibernateTemplate().find("from User");
}
//删除某个用户的所有信息
public void deleteUser(String userid) {
System.err.println("UserDao删除某个用户的所有信息");
Object p = getHibernateTemplate().load(User.class, new Integer(userid));
getHibernateTemplate().delete(p);
}
}

[/code]

请问这是为什么呢?

猜测可能原因:
1.hibernate方言是否设置
2. 可能user在sqlserver中被判定成了关键字,改个其他名字试试。

from user user0_ where user0_.username=?

这里有2个user

.find("from User");

改成
.find(); 看看

哦,对的,User在sqlserver里面是[url=http://msdn.microsoft.com/en-us/library/aa238507%28v=sql.80%29.aspx]保留字段[/url]

如果你想在sqlserver使用保留字段,可以find("from [User]")。但是,强烈建议你不要使用这些保留字

此外,user this_ =》 this_是一个别名,中间可以使用as,也是不是用。

看sql2008标准

[code="java"]
[ FROM { < table_source > } [ ,...n ] ]
< table_source > ::=
table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
| view_name [ [ AS ] table_alias ] [ WITH ( < view_hint > [ ,...n ] ) ]
| rowset_function [ [ AS ] table_alias ]
| user_defined_function [ [ AS ] table_alias ]
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
| < joined_table >
[/code]

HQL操作的是对象。
不要使用常用的名字。