2017-01-16 4 views
0

Ich arbeite in einem Schulprojekt, wo ich im Backend mit Java/Spring/Hibernate arbeite. Während der Arbeit mit der Datenbankanforderung ist dieser Fehler aufgetreten. Ich kann es anscheinend nicht lösen. Ich habe versucht, Parameter bei 1 zu starten, aber es ist der gleiche Fehler. Danke für Ihre Hilfe!verschachtelte Ausnahme ist java.lang.IllegalArgumentException: Keine Positionsparameter in Abfrage

Etat HTTP 500 - Anfrage Verarbeitung fehlgeschlagen; verschachtelte Ausnahme ist java.lang.IllegalArgumentException: Keine Positionsparameter in der Abfrage: FROM fr.netrust.model.User WHERE username =? UND Passwort =?

model.User

@Entity 
@Table(name="user") 
public class User implements Serializable { 
    private static final long serialVersionIUD = 1L; 

    @Id 
    @Column(name="id") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private long id; 
    private String username; 
    private String password; 

     public User() { 
      super(); 
     } 

     public User(String username, String password) { 
      super(); 
      this.username = username; 
      this.password = password; 
     } 

     public long getId() { 
      return id; 
     } 

     public void setId(long id) { 
      this.id = id; 
     } 

     public String getUsername() { 
      return this.username; 
     } 

     public void setUsername(String username) { 
      this.username = username; 
     } 

     public String getPassword() { 
      return this.password; 
     } 

     public void setPassword(String password) { 
      this.password = password; 
     } 

    } 

UserDto

package fr.netrust.dto; 

public class UserDto { 

    private long id; 
    private String username; 
    private String password; 

    public UserDto() { 

    } 

    public UserDto(long id, String username, String password) { 
     super(); 
     id = this.id; 
     username = this.username; 
     password = this.password; 
    } 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

} 

UserDaoImpl

package fr.netrust.dao.impl; 

@Repository 
@Transactional 
public class UserDaoImpl implements UserDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Override 
    @Transactional(readOnly=true) 
    public int isValidUser(String username, String password) { 
     Session session = sessionFactory.openSession(); 
     Transaction tx = session.beginTransaction(); 
     Query sql = session.createQuery("FROM fr.netrust.model.User WHERE username=? AND password=?"); 
     sql.setString(0, username); 
     sql.setString(1, password); 
     User result = (User) sql.uniqueResult(); 
     tx.commit(); 
     session.flush(); 
     session.close(); 
     return (int) (result==null?0:result.getId()); 
    } 

Usercontroller

package fr.netrust.web; 

@Controller 
public class UserController { 

    @Autowired 
    private UserDao userDao; 

    @Autowired 
    private UserDaoAdapter userDaoAdpter; 

    @RequestMapping(value = "/log", method = RequestMethod.GET) 
    @ResponseBody 
    public int log(HttpServletRequest req) throws SQLException { 
     return userDao.isValidUser(req.getParameter("username"), req.getParameter("password")); 

    } 
} 

datasource.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://127.0.0.1:3306/NeTrust"></property> 
     <property name="username" value="descartes" /> 
     <property name="password" value="descartes" /> 
    </bean> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="fr.netrust.web" />  
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
       <prop key="hibernate.show_sql">false</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/pages/" p:suffix=".jsp"/> 

</beans> 

[EDIT]

@Override 
@Transactional 
public int isValidUser(String username, String password) { 
    Session session = sessionFactory.openSession(); 
    Transaction tx = session.beginTransaction(); 
    Query sql = session.createQuery("FROM fr.netrust.model.User U WHERE U.username = :username AND U.password = :password"); 
    sql.setParameter("username", username); 
    sql.setParameter("password", password); 
    User result = (User) sql.uniqueResult(); 
    tx.commit(); 
    session.flush(); 
    session.close(); 
    return (int) (result==null?0:result.getId()); 
} 
+0

Haben Sie Ihre [Mapping] aktualisiert (http://stackoverflow.com/questions/20610221/illegalargumentexceptionno-positional-parameters-in-query)? –

+0

Ich habe keine Hibernate-Conf-Datei. Aber mein Kumpel gab mir eine Bean-Datei mit einer Ruhezustandskonfiguration. –

Antwort

0

Die setString 1 basierten Index wie in diesem Beispiel: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

So

sql.setString(1, username); 
sql.setString(2, password); 

sollten Werke .

Bearbeitet: Mein schlechtes ist Winterschlaf.

Zuerst Verwendung benannter Parameter wie in diesem Beispiel: https://www.tutorialspoint.com/hibernate/hibernate_query_language.htm

mit Hibernate, müssen Sie Aliasnamen für Ihre Tabelle verwenden. Daher muss die Abfrage so etwas wie sein:

Query sql = session.createQuery("FROM fr.netrust.model.User U" + 
    " WHERE U.username=:username AND U.password=password"); 
sql.setString("username", username); 
sql.setString("password", password); 
+0

Ich hatte es versucht, aber es ist der gleiche Fehler. –

+0

Haben Sie versucht, eine 'SELECT wie folgt hinzuzufügen: session.createQuery ("SELECT * FROM ..." – JFPicard

+0

Ich habe nicht, aber ich habe es gerade versucht, und das ändert nicht die Ausgabe. –

Verwandte Themen