2015-09-15 19 views
0

在春天使用hibernate模板時獲取此異常。引起:org.hibernate.QueryException:並非所有命名參數都已設置:在使用休眠模板時

Caused by: org.hibernate.QueryException: Not all named parameters have been set: [roledesc, sapid, pass] [ 
     select u from Role as r left join r.users as u where u.sapid=:sapid and u.pass=:pass and r.roledesc=:roledesc 
    ] 
    at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:291) 
    at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:275) 
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:75) 
    at org.springframework.orm.hibernate3.HibernateTemplate$33.doInHibernate(HibernateTemplate.java:988) 
    at org.springframework.orm.hibernate3.HibernateTemplate$33.doInHibernate(HibernateTemplate.java:1) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) 
    ... 30 more 

這裏就是我試圖獲取命名查詢類:

public class LoginDaoImpl extends AbstractDaoImpl implements LoginDao { 

    private static final Logger LOGGER = Logger.getLogger(LoginDaoImpl.class); 

    @Override 
    public User loginCheck(User user, Role role) { 
     LOGGER.debug("Inside validate user:" + user.getPass()); 

     user.setName(""); 

     List<User> employee = new ArrayList<User>(); 

     Query query = (Query) template.findByNamedQuery("findRoleforaUser"); 

     query.setString("sapid", user.getSapid()); 
     query.setString("pass", user.getPass()); 
     query.setString("roledesc", role.getRoledesc()); 
      employee = query.list(); 
      if(employee == null) 
      { 
       user.setName(""); 
      } 

      else if(employee.isEmpty()) 
      { 
       user.setName(""); 
      } 


      else if (!(user.getPass().equals(employee.get(0).getPass()))) 

       LOGGER.info("No match found!"); 
      else { 
       user.setName(employee.get(0).getName()); 
       LOGGER.debug("\nUser \"" + employee.get(0).getName() 
         + "\" found and login is successful "); 

      } 


       return user; 
    } 

} 

這裏是哪裏命名查詢定義我.hbm文件內容:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-mapping SYSTEM "D:\My HCL JEE Progs\CBA_Quiz\src\dtd\hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="com.hcl.cba.payments.domain.Role" table="roles"> 
     <id name="roleid" type="int" column="ROLEID" /> 
     <property name="roledesc" type="string" column="ROLEDESC" /> 
     <set name="users" cascade="all"> 
      <key column="roleid" /> 
      <one-to-many class="com.hcl.cba.payments.domain.User" /> 
     </set> 
    </class> 
    <query name="findRoleforaUser"> 
     <![CDATA[select u from Role as r left join r.users as u where u.sapid=:sapid and u.pass=:pass and r.roledesc=:roledesc]]> 
    </query> 
</hibernate-mapping> 

PS:我試着運行/訪問沒有休眠模板的查詢,它運行良好,我也設置了變量:

 Query query = session.findByNamedQuery("findRoleforaUser"); 
     query.setString("sapid", user.getSapid()); 
     query.setString("pass", user.getPass()); 
     query.setString("roledesc", role.getRoledesc());    
     employee =query.list(); 
+0

嘗試用''的query.setParameter()代替'query.setString()' –

+0

相同的異常的人! :(@Predrag Maric –

回答

0

這應該工作

List<User> employees = new ArrayList<User>(); 
String[] paramNames = { "sapid", "pass", "roledesc" }; 
Object[] values = { user.getSapid(), user.getPass(), role.getRoledesc() }; 
employees = template.findByNamedQueryAndNamedParam("findRoleforaUser", paramNames, values); 
+1

'findByNamedQueryAndNamedParam'和'findByNamedQuery'應該返回一個List。這怎麼能夠被轉換成一個Query對象? – wero

+0

是的......它拋出了一個類拋出異常,我將它改成列表並且工作。 '編輯答案並接受它! –

+0

@wero你說得對,我只是從問題中複製而沒有注意到這一點,謝謝。 –

相關問題