2016-03-24 5 views
1

私のプロジェクトに問題があります。ここでエラー:org.hibernate.hql.internal.ast.QuerySyntaxException、Help me?

Hibernate: insert into userdat (password, birthday, age, gender, username) value s (?, ?, ?, ?, ?) Mar 25, 2016 5:05:04 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper$Standar dWarningHandler logWarning WARN: SQL Warning Code: 10000, SQLState: 01J01 Mar 25, 2016 5:05:04 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper$Standar dWarningHandler logWarning WARN: Database 'D:\PROJECTSPRING\userdb' not created, connection made to existin g database instead. Mar 25, 2016 5:05:04 AM org.hibernate.hql.internal.QueryTranslatorFactoryInitiat or initiateService INFO: HHH000397: Using ASTQueryTranslatorFactory Hibernate: select user0_.username as username1_0_, user0_.password as password2_ 0_, user0_.birthday as birthday3_0_, user0_.age as age4_0_, user0_.gender as gen der5_0_ from userdat user0_ Mar 25, 2016 5:05:04 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExce ptions WARN: SQL Error: 20000, SQLState: 22005 Mar 25, 2016 5:05:04 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExce ptions ERROR: An attempt was made to get a data value of type 'byte[]' from a data valu e of type 'VARCHAR'. [WARNING] org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.DataException: could not execute que ry at org.springframework.web.servlet.FrameworkServlet.processRequest(Frame workServlet.java:973) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServl et.java:852) at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkSer

はここ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)); 

    } 


} 

ファイルをファイルここ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(); 
    } 


} 

ファイル:私ブラウザhttp://localhost:8080/user/formは、リストのユーザーを表示するには、直接http://localhost:8080/user/list後にユーザーの情報を記入する場合は、次のエラーが発生UserDaoImpl.java

あなたはHibernateでselect文を書くとき
@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> 
+0

userdatがapped' –

+0

@Ralph [userdatから]、あなたは私を助けることができるメートル ではありません!!!! –

+0

Userクラスも投稿してください。 – Ralph

答えて

1

ファイルファイルファイル、あなたはそれを書きますHQLではなく、SQLにあります。それらの主な違いの1つは、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を比較すると、一度のような問題を引き起こす可能性があるのは1つだけです。それは列挙型です。注釈では、enumはその名前(string/varchar)でマップされますが、hbm.xmlではenumは序数(整数)でマップされます。それで試してみてください。列挙型に使用されている列が整数列であることを確認します。列の種類を変更できない場合は、マッピングを変更する必要があります。いくつかのGoogleの調査によると、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> 
+0

私は理解して編集しましたが、新しいエラーが発生しますエラー: 'タイプ' byte [] 'のデータ値を取得しようとしました。 'VARCHAR'タイプのデータ値eから –

+0

私のポストに新しいエラーが投稿されました。 –

1

あなたにあなたのテーブルuserdatをマッピングする必要がありますUserエンティティをHQLクエリに渡します。あなたはそれをマッピングしたら、その後、

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

thisの例を見て持っている、とドキュメントのセクションについて mappingsを休止することができます。 org.hibernate.hql.internal.ast.QuerySyntaxException:それは `による表示@Ralph

+0

あなたの方法で編集しましたが、新しいエラーが発生しました: 'ERROR: 'VARCHAR'型のデータ値 eから 'byte []'型のデータ値を取得しようとしました。 [警告] ' –

+0

投稿に新しいエラーが投稿されました –

+0

' Gender'もマップする必要があります。実際にはDBの 'varchar'で' Serializable'と仮定しています。 'String'としてマップすることで、ドキュメント内の' component'マッピングを単純化したり探すことができます。 –

関連する問題