我初学hibernate 在学习一个简单的注册模块,在DAOImpl 实现类中写查询方法public User queryByID(String username) {
List list = this.getHibernateTemplate().find(
"select user from User user where user.username ='" + username+ "'");
if (list.size() == 0) {
return null;
} else {
return (User) list.get(0);
} }例子中,用的表名为user 所以例子中的代码为上面所写。但我现在的表名为BLOG_USER 那么我该如何修改这条HQL语句。
我试着
List list = this.getHibernateTemplate().find(
"select BLOG_USER from User BLOG_USER where BLOG_USER.username ='" + username+ "'");但报错
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not execute query; uncategorized SQLException for SQL [select user0_.username as username0_, user0_.password as password0_, user0_.nickname as nickname0_, user0_.question as question0_, user0_.answer as answer0_ from User user0_ where user0_.username='zzs_woods']; SQL state [ZZZZZ]; error code [156]; Incorrect syntax near the keyword 'User'.
; nested exception is com.sybase.jdbc3.jdbc.SybSQLException: Incorrect syntax near the keyword 'User'.请教,我该如何写这条代码。谢谢!

解决方案 »

  1.   

    User user不是表明,知识对应的实体类名吧,实体类名再跟Hibernate映射文件的表名对应
      

  2.   


    List list = this.getHibernateTemplate().find(
                    "from BlogUser user where user.username ='" + username+ "'");
    重新生成BLOG_USER表的映射文件和pojo
      

  3.   

    hibernate看的不是数据库中的表名,而是看你映射出来的java类的名称是什么,你的表叫BLOG_USER,通常映射出来的对象名应该是BlogUser
    所以你只要像下边这样写,要带上BlogUser所在的报路径,比如:cn.test.BlogUser
     "select user from BlogUser user where user.username ='" + username+ "'");
      

  4.   

    呵呵,這個HQL不是與你的數據庫表直接打交道的,他操作的是pojo類,所以這個問題的解決就是去修改POJO類中的對應的標注或者是XML配置文件中指向的類名。
      

  5.   

    谢谢大家,我搞定了。
    原来是在我的*.hbm.xml 里面 我按例子写的,没有指定我的表名
    <hibernate-mapping>
    <class name="com.jxccblog.po.User">
    <id name="username">
    <generator class="assigned"></generator>
    </id>
    <property name="password"></property>
    <property name="nickname"></property>
    <property name="question"></property>
    <property name="answer"></property>
    </class>
    </hibernate-mapping>现在,我在class 里面添加了表名
    <hibernate-mapping>
    <class name="com.jxccblog.po.User" table="BLOG_USER">
    <id name="username">
    <generator class="assigned"></generator>
    </id>
    <property name="password"></property>
    <property name="nickname"></property>
    <property name="question"></property>
    <property name="answer"></property>
    </class>
    </hibernate-mapping>
    问题就解决了。可是我在DAO的实现类中,还是如前面所写
     List list = this.getHibernateTemplate().find(
                    "select user from User user where user.username ='" + username+ "'");这样会有隐含的问题吗?另外我想问问大家,为什么一开始在*.hbm.xml 中class 属性中没有写表名,难道表名不是必写项吗?如果不写,会默认为什么表名啊?
    谢谢大家,结贴!
      

  6.   


    List list = this.getHibernateTemplate().find(
                    "select BLOG_USER from User BLOG_USER where BLOG_USER.username ='" + username+ "'");这条语句是错误的,hql语句所查询的是pojo对象,不是数据库中的表,你要想查询BLOG_USER表中的数据,首先得配置BLOG_USER表的映射文件,例如:BlogUser.hbm.xml,还有一个BlogUser类文件,然后在hibernate.cfg.xml文件中将BlogUser.hbm.xml加载进来,hql语句中所有的字段都是BlogUser类中的属性
    例如:
    List list = this.getHibernateTemplate().find(
                    "select b.userid,b.password from User BlogUser b where b.username ='" + username+ "'");BlogUser
    b.userid,b.password,b.username 都是BlogUser对象中的属性还是先看看hibernate的配置方法吧
      

  7.   


    默認的是和數據庫中的表名一致啊,你最開始不就是USER嗎? POJO類名也是USER,所以不會出錯。