2016-03-24 7 views
1

Ich habe ein Problem mit meinem Projekt. Wenn i Browser http://localhost:8080/user/form nach direktem http://localhost:8080/user/list Informationen über den Benutzer zu füllen auftritt Liste Benutzer angezeigt werden dann folgende Fehlermeldung:Fehler: org.hibernate.hql.internal.ast.QuerySyntaxException, Hilf mir?

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

Hier 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(); 
    } 


} 

Hier Datei 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)); 

    } 


} 

Hier Datei Datei 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(); 
    } 


} 

Hier Datei 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; 


} 

Hier Datei 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; 
    } 

Hier 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

@Ralph es Anzeige 'verursacht durch: org.hibernate.hql.internal.ast.QuerySyntaxException: userdat ist nicht m appmed [von userdat]' –

+0

@Ralph, können Sie mir helfen !!!! –

+0

Bitte posten Sie auch die Benutzerklasse. – Ralph

Antwort

1

Datei Wenn Sie eine SELECT-Anweisung mit Hibernate schreiben dann schreiben Sie es in HQL, aber nicht in SQL. Einer der Hauptunterschiede zwischen ihnen besteht darin, dass Sie in HQL Klassennamen und Feldnamen schreiben, in SQL würden Sie Tabellennamen und Spaltennamen verwenden.

Es ist wahrscheinlich, dass der Klassenname Ihrer Entität User lautet und der Tabellenname userdat lautet. Deshalb ist die richtige wäre HQL Statement sein: from User (Groß U!) Statt 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(); 
} 

Btw ist es das gleiche für public User loadUser(String username)


Nach Ihrer modifizierten Frage(btw Beim nächsten Mal eine neue Frage aufwerfen, anstatt die alte zu ändern, wenn diese Änderung die Art der Frage ändert)

Zuerst möchte ich sagen, dass ich mich wundere, dass heutzutage jemand noch hbm.xml-Dateien anstelle von Annotation verwendet, aber vielleicht haben Sie einen guten Grund. ...

Wenn ich die hbm.xml mit den Kommentaren (auskommentiert) vergleiche, gibt es nur eine Sache, die vielleicht ein Problem verursacht, wie Ihr einmal: es ist die Enumeration. In den Annotationen wird die Enumeration über ihren Namen (string/varchar) abgebildet, aber in hbm.xml wird sie über ihre Ordinalzahl (ganze Zahl) abgebildet. Also probier es aus. Stellen Sie sicher, dass die für die Enumeration verwendete Spalte eine Ganzzahlspalte ist, wenn nicht, machen Sie sie zu einer Spalte. Wenn Sie den Spaltentyp ändern können/wollen, müssen Sie das Mapping ändern. Nach einigen Google-Forschung, Abbilden eines ENUM über seinen Namen von XML ist seltsam: (! Der wichtige Punkt es die 12, es ist die interne Darstellung für varchar ist)

<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

ich verstanden und ich habe bearbeitet, aber einen neuen Fehler auftreten ERROR: 'Es wurde versucht, einen Datenwert vom Typ 'Byte []' zu bekommen von einem Datenwert e des Typs "VARCHAR" –

+0

ich habe neuen Fehler auf meinem Beitrag, können Sie mir helfen !! –

1

Sie benötigen eine Tabelle zur Karte userdat zu Ihrer User Entität um eine HQL-Abfrage.Sobald Sie es zugeordnet haben, können Sie dann tun

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

einen Blick auf this Beispiel haben und über mappings Dokumentation Abschnitt Hibernate.

+0

Ich habe mit Ihrem Weg bearbeitet, aber einen neuen Fehler auftreten: 'Fehler: Es wurde versucht, einen Datenwert vom Typ 'Byte []' aus einem Datenwert e des Typs 'VARCHAR' zu erhalten. [WARNUNG] ' –

+0

Ich habe einen neuen Fehler in meinem Beitrag –

+0

Sie müssen auch' Gender' zuordnen, es wird angenommen, dass es 'Serializable' ist, wenn es tatsächlich ein' varchar' in DB ist. Ordnen Sie es als 'String' zu, um die Komponentenzuordnungen in den Dokumenten zu vereinfachen oder nach solchen zu suchen. –