【问题标题】:Error: org.hibernate.hql.internal.ast.QuerySyntaxException, Help me?错误:org.hibernate.hql.internal.ast.QuerySyntaxException,帮帮我?
【发布时间】:2016-07-12 15:49:20
【问题描述】:

我的项目有问题。当我浏览http://localhost:8080/user/form 在直接http://localhost:8080/user/list 显示列表用户后填写用户信息时出现以下错误:

休眠:插入用户数据(密码、生日、年龄、性别、 用户名)值 s (?, ?, ?, ?, ?) Mar 25, 2016 5:05:04 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper$Standar dWarningHandler logWarning WARN:SQL 警告代码:10000,SQLState: 01J01 2016 年 3 月 25 日上午 5:05:04 org.hibernate.engine.jdbc.spi.SqlExceptionHelper$Standar dWarningHandler logWarning 警告:数据库 'D:\PROJECTSPRING\userdb' 未创建,而是与现有数据库建立连接。 3月25日, 2016 上午 5:05:04 org.hibernate.hql.internal.QueryTranslatorFactoryInitiat 或 启动服务信息:HHH000397:使用 ASTQueryTranslatorFactory Hibernate:选择 user0_.username 作为 username1_0_,user0_.password 作为 密码2_ 0_,用户0_.生日为生日3_0_,用户0_.年龄为年龄4_0_, user0_.gender 作为 gen der5_0_ 来自 userdat user0_ 2016 年 3 月 25 日 5:05:04 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper 日志异常 警告:SQL 错误:20000,SQLState:22005 2016 年 3 月 25 日上午 5:05:04 org.hibernate.engine.jdbc.spi.SqlExceptionHelper 日志异常错误: 尝试从数据中获取类型为“byte[]”的数据值 'VARCHAR' 类型的值。 [警告] org.springframework.web.util.NestedServletException:请求 处理失败;嵌套异常是 org.hibernate.exception.DataException:无法执行查询 在 org.springframework.web.servlet.FrameworkServlet.processRequest(框架 workServlet.java:973) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServl et.java:852) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkSer

这里文件CustomContextLoaderListener.java

public class CustomContextLoaderListener extends ContextLoaderListener{

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // TODO Auto-generated method stub
        System.out.println("hibernate shutdown database");
        try {
            DriverManager.getConnection("jdbc:derby:D:/PROJECTSPRING/userdb;shutdown=true");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("\n Spring-MVC application destroyed \n");
        super.contextDestroyed(event);

    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // TODO Auto-generated method stub
        System.out.println("\n Spring-MVC application inited \n");
        try {
            createTable();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        super.contextInitialized(event);
    }

    public void createTable() throws SQLException{
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            Connection connection = DriverManager.getConnection("jdbc:derby:D:/PROJECTSPRING/userdb;create=true");
            createTableNotExist(connection,"userdat", "create table userdat"
                    + "(username varchar(1000) primary key,"
                    + "password varchar(1000),birthday date,"
                    + "age integer,gender varchar(100))");
//          createTableNotExist(connection,"subject","create table subject"
//                  + "(id bigint primary key generated always as identity(start with 1,increment by 1),"
//                  + "title varchar(1000),student integer,score integer)" );
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    public void createTableNotExist(Connection connection,
            String tableName,String createTableSQL) throws SQLException{
        DatabaseMetaData dbmd = connection.getMetaData();
        ResultSet rs = dbmd.getTables(null, null,tableName.toUpperCase(), null);
        if (rs.next()){
            System.out.println("Table" + rs.getString("TABLE_NAME") + "already exists");
            return;

        }
        System.out.println("anh yeu em");
        Statement statement = connection.createStatement();
        statement.execute(createTableSQL);
        System.out.println("\n\n executed" + createTableSQL + "\n\n");
        statement.close();
    }


}

这里文件UserRestServiceController.java

@Controller
public class UserRestServiceController {
    @Autowired
    private UserDao userDao;
    @Autowired
    private View jsonView;
    @RequestMapping(value="/user/form",method = RequestMethod.GET)
    public ModelAndView user() {
//      System.out.println("anh yeu em ");
        ModelAndView model = new ModelAndView("UserForm", "User", new User());

        model.addObject("allgender", Gender.values());

        return model;
    }

    @RequestMapping(value="/user/save", method = RequestMethod.POST)
    public ModelAndView saveUser(@ModelAttribute("User") User user,BindingResult result){

        ModelAndView model = new ModelAndView();
        System.out.println("anh yeu em ");
        if (result.hasErrors()){
            model = new ModelAndView("UserForm","User",user);
            model.addObject("errors",result);
            return model;
        }
        userDao.save(user);
        model = new ModelAndView("redirect:/user/list");
        return model;

    }

    @RequestMapping(value="/user/list",method = RequestMethod.GET)
    public ModelAndView listUser(){
        ModelAndView model = new ModelAndView();
        List<User> listUser = userDao.listUsers();
        model = new ModelAndView("UserList","Users",listUser);
        return model;
    }
    @RequestMapping(value="/user/json/{username}")
    public ModelAndView loadUser(@PathVariable("username")String name){
        return new ModelAndView(jsonView,"data",userDao.loadUser(name));
    }
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));

    }


}

这里文件UserDaoImpl.java

@Repository
public class UserDaoImpl implements UserDao{
    @Autowired
    public LocalSessionFactoryBean sessionFactory;


    @Override
    public void save(User user) {
        // TODO Auto-generated method stub
        Session session = sessionFactory.getObject().openSession();
        session.save(user);
        session.flush();
        session.close();

    }

    @Override
    public void update(User user) {
        // TODO Auto-generated method stub

    }

    @Override
    public List<User> listUsers() {
        // TODO Auto-generated method stub
        Session session = sessionFactory.getObject().openSession();
        Query query = session.createQuery("from User");
        return (List<User>)query.list();
    }

    @Override
    public void delete(User user) {
        // TODO Auto-generated method stub
        Session session = sessionFactory.getObject().openSession();
        session.delete(user);

    }

    @Override
    public User loadUser(String username) {
        // TODO Auto-generated method stub
        Session session = sessionFactory.getObject().openSession();
        Query query = session.createQuery("from User "
                + "where username = :user_name");
        query.setParameter("user_name",username);
        return (User) query.uniqueResult();
    }


}

这里文件User.java

@Entity
//@Table(name = "user",uniqueConstraints={@UniqueConstraint(columnNames="username")})
public class User {
//  @Column(name = "gender", nullable = false)
//  @Enumerated(EnumType.STRING)
    public Gender getGender() {
        return gender;
    }
    public void setGender(Gender gender) {
        this.gender = gender;
    }
//  @Id
//  @GeneratedValue(strategy = GenerationType.IDENTITY)
//  @Column(name = "username", unique = true, nullable = false)
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
//  @Column(name = "password", nullable = false)
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
//  @Column(name = "birthday", nullable = false)
    public Date getBirthDay() {
        return birthDay;
    }

    public void setBirthDay(Date birthDay) {
        this.birthDay = birthDay;
    }
//  @Column(name="age", nullable = false)
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    private String userName;
    private String passWord;
    private Date birthDay;
    private Integer age;
    private Gender gender;


}

这里是 Gender.java 文件

public enum Gender {
    MALE("Male"),
    FEMALE("Female"),
    OTHER("Other");
    private String name;

    private Gender(String name) {
        this.name = name;
    }

    public String getGender(){
        return this.name;
    }

这里文件User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="edu.java.spring.service.user.model.User" table="userdat">
        <id name="userName" column="username"/>
        <property name="passWord" column="password"/>
        <property name="birthDay"  column="birthday"/>
        <property name="age"  column="age"/>
        <property name="gender" column="gender" />

    </class>
</hibernate-mapping>

【问题讨论】:

  • @Ralph 它显示Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: userdat is not m apped [from userdat]
  • @Ralph,你可以帮帮我!!!!
  • 请也发布 User 类。
  • @Ralph,我已经在我的帖子上发布了 User.java
  • 查看我的更新答案

标签: spring hibernate jetty derby


【解决方案1】:

当您使用 Hibernate 编写 select 语句时,您使用 HQL 而不是 SQL 编写它。它们之间的主要区别之一是,在 HQL 中您编写类名和字段名,在 sql 中您将使用表名和列名。

很可能您的实体的类名是User,而表名是userdat。因此正确的 HQL 语句应该是:from User (大写 U!) 而不是 from userdat

@Override
public List<User> listUsers() {
    // TODO Auto-generated method stub
    Session session = sessionFactory.getObject().openSession();
    Query query = session.createQuery("from User");
    return (List<User>)query.list();
}

顺便说一句,public User loadUser(String username) 也一样


根据您修改后的问题 (顺便说一句。如果此修改改变了问题的性质,下次提出一个新问题而不是更改旧问题)

首先让我声明,我想知道现在有人仍然使用 hbm.xml 文件而不是注释,但也许你有一些很好的理由。 ...

当我将 hbm.xml 与(注释掉的)注释进行比较时,只有一件事可能会导致像您曾经遇到的问题:它是枚举。在注释中,枚举通过其名称(字符串/varchar)进行映射,但在 hbm.xml 中,它通过其序数(整数)进行映射。所以试试吧。检查用于枚举的列是否为整数列,如果不是,则使其为一。如果您可以/不想更改列类型,则需要更改映射。根据一些谷歌研究,通过 xml 的名称映射枚举很奇怪:(重要的是 12,它是 varchar 的内部表示!)

<property name="gender" length="30">
   <type name="org.hibernate.type.EnumType">
      <param name="enumClass">full.qualifiey.name.for.Gender</param>
      <param name="type">12</param>
   </type>
</property>

【讨论】:

  • 我理解并且我已经编辑了,但是出现了一个新的错误错误:An attempt was made to get a data value of type 'byte[]' from a data valu e of type 'VARCHAR'
  • 我的帖子有新的错误,你能帮帮我吗!
【解决方案2】:

您需要将表 userdat 映射到您的 User 实体才能进行 HQL 查询。一旦你映射了它,你就可以做

Query query = session.createQuery("from User");

查看this 示例和有关mappings 的Hibernate 文档部分。

【讨论】:

  • 我已经按照你的方式编辑了,但是出现了一个新的错误:ERROR: An attempt was made to get a data value of type 'byte[]' from a data valu e of type 'VARCHAR'. [WARNING]
  • 您还需要映射Gender,假设它是Serializable,而实际上它是数据库中的varchar。映射为 String 以简化或在文档中查找 component 映射。
  • 你可以告诉我具体如何解决?
  • 最快的方法是将您的private Gender gender; 更改为private String gender;。随时更新您的问题,以便其他人也能提供帮助。
  • 我不这么认为,因为我的项目有一个类是 Gender.java
猜你喜欢
  • 1970-01-01
  • 2016-12-28
  • 2015-09-13
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
相关资源
最近更新 更多