org.hibernate.QueryParameterException:位置超出声明的序数参数数量

问题描述

登录存储库

@Repository
public class LoginRepository {
    @Autowired
    private HibernateTemplate hibernateTemplate;
    
    public List logDetails(Student st) {
        List list=hibernateTemplate.find("select email,password from Student where email='?' and password='?'",st.getEmail(),st.getpassword());
        return list;
    }
}

登录服务

@Service
public class LoginService {
    @Autowired
    private LoginRepository logRepo;

    public List serLogin(Student s) {
        List li = logRepo.logDetails(s);
        return li;
    }

}

登录控制器

@Controller
public class LoginController {
    @Autowired
    private LoginService logSer;

    @RequestMapping("/login")
    public String loginPage(Map<String,Object> map) {
        Student s = new Student();
        map.put("log",s);
        System.out.println("Inside Login Controller");
        return "login";
    }

    @RequestMapping(value = "/saveLog",method = RequestMethod.POST)
    public String saveLogin(@modelattribute("log") Student s,Map<String,Object> map) {
        List list = logSer.serLogin(s);
        if (list == null) {
            return "login";
        } else {
            map.put("log",s);
            return "home";
        }
    }
}

错误

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/SpringMVC-web] threw exception [Request processing Failed; nested exception is org.springframework.orm.hibernate3.HibernateQueryException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1; nested exception is org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1] with root cause
org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1
    at org.hibernate.engine.query.ParameterMetadata.getordinalParameterDescriptor(ParameterMetadata.java:81)
    at org.hibernate.engine.query.ParameterMetadata.getordinalParameterExpectedType(ParameterMetadata.java:87)
    at org.hibernate.impl.AbstractQueryImpl.determineType(AbstractQueryImpl.java:445)
    at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:417)
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:918)
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:912)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912)
    at com.pp.repository.LoginRepository.logDetails(LoginRepository.java:16)
    at com.pp.service.LoginService.serLogin(LoginService.java:17)
    at com.pp.controller.LoginController.saveLogin(LoginController.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at 

我实际上是在这里检查记录时输入的数据是否存在于数据库中。如果数据为 null,则列表将为 null,并且它会发送回登录其他主页。 任何人都可以帮助我。

解决方法

JPQL 样式的 positional parameters 使用问号后跟序数 - ?1?2 来声明。 序数以 1 开头。与命名参数一样,位置参数也可以在查询中多次出现。

因此,您应该以这种方式更正您的查询:

select s.email,s.password from Student s where s.email=?1 and s.password=?2