所以我试图在网上找到一个关于创建一个带有sql查询引用多个表的preparedStatement的例子。
例如到目前为止我遇到的例子总是
e.g。
s = conn.prepareStatement ("DELETE FROM Users WHERE id_user = ?");
s.setInt (1, 2);
其中只涉及一个表,并且该方法存在于数据库表的同一个类中。例如。 User.class,数据库中的用户表。
我的查询要求我从另一个表/类中设置占位符。在这种情况下,我的方法存在于User.class中,但是,它需要来自Group对象的绑定。
SELECT DISTINCT *
FROM usuarios
WHERE NOT EXISTS
(SELECT * FROM usuarios_grupos
WHERE usuarios_grupos.id_grupo = ?
AND usuarios_grupos.id_usuario = usuarios.id_usuario);
方法如下:
public List<Usuarious> list(Grupos groups) throws DAOExceptions {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
List<Usuarious> users = new ArrayList<Usuarious>();
try {
connection = daoFactory.getConnection();
preparedStatement = connection.prepareStatement(SQL_LIST_ALL);
preparedStatement.setInt(1, groups.getId_grupo());
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
users.add(mapUser(resultSet));
}
} catch (SQLException e) {
throw new DAOExceptions(e);
} finally {
close(connection, preparedStatement, resultSet);
}
return users;
}
还是会以不同的方式写出?因为我似乎正在接受这个NPE,以及我在网上看过的例子。查询始终引用1表。我在这里做错了什么?
好的,这是我的group.getId_grupo()的方法,它存在于我的Group.class中:
public class Grupos {
Integer id_grupo;
String descricao;
public Grupos() {
}
public Grupos(Integer id_grupo, String descricao) {
this.id_grupo = id_grupo;
this.descricao = descricao;
}
public Grupos(Integer id_grupo) {
this.id_grupo = id_grupo;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Integer getId_grupo() {
return id_grupo;
}
public void setId_grupo(Integer id_grupo) {
this.id_grupo = id_grupo;
}
}
我在ManagedBean中调用我的列表列表(Grupos组)方法
public class UsuariousGruposBean implements Serializable {
private Usuarious user = new Usuarious();
private Grupos grps = new Grupos();
private UsuariousGrupos userGroups = new UsuariousGrupos();
protected final UsuariousDAO userDAO = daoFactory.getUserDAO();
protected final GruposDAO grpDAO = daoFactory.getGruposDAO();
protected final UsuariousGruposDAO userGrpDAO = daoFactory.getUsuariousGruposDAO();
private List<Usuarious> listOfUsuarios;
private List<Grupos> listOfGrps;
private List<UsuariousGrupos> listOfUserGroups;
public UsuariousGruposBean() {
}
public List<Usuarious> getListOfUsuarios() throws DAOExceptions {
List<Usuarious> usuariosList = userDAO.list(grps);
listOfUsuarios = usuariosList;
return listOfUsuarios;
}
答案 0 :(得分:3)
您的代码中的第一个实例可以抛出NPE:
preparedStatement = connection.prepareStatement(SQL_LIST_ALL);
如果你的连接为空,你的连接工厂没有给你一个,检查你是否有一个有效的连接
第二名:
groups.getId_grupo()
检查您的群组是否为空
如果这些不是原因,请发布您的堆栈跟踪。
答案 1 :(得分:0)
NPE的堆栈跟踪应该有助于告诉您问题所在(行#等)。据我所知,您的SQL以及您调用它的方式都是有效的。
您是否有可能收到空groups
参数,以致调用groups.getId_grupo()
正在抛出NPE?