使用sql查询引用多个表的preparedstatement

时间:2011-12-06 11:01:24

标签: java sql jdbc

所以我试图在网上找到一个关于创建一个带有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;
    }

2 个答案:

答案 0 :(得分:3)

您的代码中的第一个实例可以抛出NPE:

preparedStatement = connection.prepareStatement(SQL_LIST_ALL);

如果你的连接为空,你的连接工厂没有给你一个,检查你是否有一个有效的连接

第二名:

groups.getId_grupo()

检查您的群组是否为空

如果这些不是原因,请发布您的堆栈跟踪。

答案 1 :(得分:0)

NPE的堆栈跟踪应该有助于告诉您问题所在(行#等)。据我所知,您的SQL以及您调用它的方式都是有效的。

您是否有可能收到空groups参数,以致调用groups.getId_grupo()正在抛出NPE?