public List<Student> queryList(String name){ List<Student> list = new ArrayList<Student>(); Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; try { con = JDBCUtils.getConnection(); List<Object> params = new ArrayList<>(); StringBuffer sb = new StringBuffer("select * from t_student where 1=1 "); if(name != null && !"".equals(name)){ sb.append("and name like ? "); params.add(name); } sb.append("order by create_time desc"); pstmt = con.prepareStatement(sb.toString()); if(params != null && params.size()>0){ for(int i=1; i<params.size(); i++){ pstmt.setObject(i, params.get(i)); } } rs = pstmt.executeQuery(); while(rs.next()){ Student student = new Student(); student.setId(rs.getInt("id")); student.setStuno(rs.getString("stuno")); student.setName(rs.getString("name")); student.setGrade(rs.getString("grade")); student.setCreatTime(rs.getDate("create_time")); student.setUpdateTime(rs.getDate("update_time")); list.add(student); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { JDBCUtils.close(con, pstmt, rs); } return list; }
时间: 2024-01-15 14:02:35 浏览: 76
这个方法的问题在于循环遍历参数列表的时候从1开始,而不是从0开始。这个问题可能会导致第一个参数被忽略,并且在执行 SQL 语句时会出现 "Parameter index out of range (0 < 1)" 错误。你应该将循环的起始索引改为0,像这样:
```
if(params != null && params.size() > 0){
for(int i=0; i<params.size(); i++){
pstmt.setObject(i+1, params.get(i));
}
}
```
这样就可以避免这个错误了。同时,你还需要确保参数列表中的参数类型与 SQL 语句中的参数类型匹配,否则也可能会出现类似的错误。
相关问题
public Iterable<Free> queryList(FreeForm form, PageRequest page) { Specification<Free> specifications = new Specification<Free>() { @Override public Predicate toPredicate(Root<Free> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { final List<Predicate> predicateList = new ArrayList<>(); if (Objects.nonNull(form)) { if (Objects.nonNull(form.getUser())) { predicateList.add(criteriaBuilder.equal(root.get("user"), form.getUser())); } if (Objects.nonNull(form.getUserList()) && !form.getUserList().isEmpty()) { predicateList.add(criteriaBuilder.in(root.get("user")).value(form.getUserList())); } } Predicate[] predicates = predicateList.toArray(new Predicate[0]); return criteriaQuery.where(predicates).getRestriction(); } }; return repository.findAll(specifications, page); }
这段代码是一个Java方法的定义,名为queryList,返回类型为Iterable<Free>。它接受两个参数,一个是FreeForm类型的form,另一个是PageRequest类型的page。该方法使用Spring Data JPA提供的Specification接口定义了一个查询条件,用于根据form的内容查询数据库中的Free对象,并通过repository的findAll方法返回查询结果。具体实现如下:
1. 创建一个Specification接口的匿名实现,并重写其中的toPredicate方法。这个方法接受三个参数,分别是Root<Free>、CriteriaQuery<?>和CriteriaBuilder,用于生成查询条件。
2. 在toPredicate方法中,首先创建一个Predicate类型的List,用于存放所有的查询条件。然后根据form的内容,判断是否需要添加查询条件。如果form的user属性不为空,则添加一个等于user的查询条件。如果form的userList属性不为空且不为空集合,则添加一个in user列表中的查询条件。
3. 最后,将predicateList转换为一个Predicate类型的数组,并将它们传递给criteriaQuery.where方法,返回生成的查询条件。
4. 调用repository的findAll方法,传递生成的查询条件和分页参数,返回查询结果。
package org.example.application.custom.service; import org.example.application.common.base.BaseService; import org.example.application.custom.entity.Free; import org.example.application.custom.form.FreeForm; import org.example.application.system.entity.SysUser; public interface FreeService extends BaseService<Free> { Iterable<Free> queryList(FreeForm form); void save(FreeForm form); Free getById(String id); void deleteById(String id); void check(String id, Integer status); Iterable<Free> queryMineList(FreeForm form); Iterable<Free> queryCheckList(FreeForm form); void deleteByUser(SysUser user); }
这段代码是一个 Java 接口,命名为 FreeService,位于 org.example.application.custom.service 包下。它继承了 BaseService<Free> 接口,表示它是 Free 实体类的服务接口。该接口中定义了一些方法:
1. queryList(FreeForm form):查询 Free 实体列表;
2. save(FreeForm form):保存 Free 实体;
3. getById(String id):根据 ID 获取 Free 实体;
4. deleteById(String id):根据 ID 删除 Free 实体;
5. check(String id, Integer status):审核 Free 实体;
6. queryMineList(FreeForm form):查询当前用户的 Free 实体列表;
7. queryCheckList(FreeForm form):查询待审核的 Free 实体列表;
8. deleteByUser(SysUser user):根据用户删除对应的 Free 实体。
这些方法可以供其他类调用,实现对 Free 实体的数据操作。
阅读全文