Ajuda com uma list com duas classes (Resolvido)

Bom estou precisando de duas classes em uma lista
requisição e usuario
no meu bd a tabela de requisições tem uma chave estrangeira Usuario
então eu precisaria do usuario para fazer isso
user.setId(rs.getLong(“idusuario”));

public List<Requisicao> getList() {
    List<Requisicao> requisicoes = new ArrayList<>();
    String sql = "SELECT * FROM computador_requisicao";
    try {
        PreparedStatement stmt = con.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {
            Requisicao req = new Requisicao();  
            Usuario user = new Usuario();
            req.setId(rs.getLong("id"));
            user.setId(rs.getLong("idusuario"));
            req.setNome(rs.getString("nome"));
            req.setData(rs.getDate("data_requisicao"));
            req.setMotivo(rs.getString("Observacao"));
            requisicoes.add();
        }
        stmt.close();
        rs.close();
    } catch (SQLException ex) {
        return null;
    }
    return requisicoes;
}

Alguém poderia me dar uma luuz de como eu resolveria essa situação?

Você precisa pegar esse id de usuário e realizar a consulta que retorna o usuário, ou jah retornar o usuário junto com um JOIN e obter os campos usando aliases.

não man tipo meu objetivo com essa lista é mostrar todos as requisições no banco de dados
e nessa tabela de requisições tem a chave estrangeira idusuario
que é o id do usuario que a criou

minha dificuldade toda está em retornar esse valor para o metodo setId que está em outra classe
eu não quero pegar um usuario em especifico .

Requisição possui um usuário?

Não entendi essa dúvida. Onde está esse método setId?

tipo eu quero retornar uma lista com todas as requisições no bd
essa tabela de requisições possui uma chave estrangeira IdUsuario

eu queria retornar todos os registros em uma tableview inclusive o id do usuario que criou a req

porém são duas classes diferentes
Requisições Usuario, UsuarioDAO,RequisicaoDAO

essa user.setId está na classe usuario ai que está o problema eu não conseguiria adicionar esse campo na lista pq ele está em outra classe

    while (rs.next()) {
        Requisicao req = new Requisicao();  
        Usuario user = new Usuario();
        req.setId(rs.getLong("id"));
        req.setNome(rs.getString("nome"));
        req.setData(rs.getDate("data_requisicao"));
        req.setMotivo(rs.getString("Observacao"));
        requisicoes.add(req);

se fosse assim iria funcionar de boa
porém eu preciso desse campo e não faço ideia de como adicionar 2 classes na lista

eu tou com um pouco de dúvida nessa parte
eu não utilizei extend em nenhuma
eu não sei se utilizo
Usuario extends requisição ou
Requisicao extends Usuario

Nem um nem outro. Vc precisa entender a relação entre POSSUI UM e É UM. Nesse caso, penso que uma Requisicao possui um Usuario:

public class Requisicao {
	private Long id;
	private Usuario solicitante;
	// ... demais campos da requisição
	
	// getters e setters
}

Seguindo isso, basta retornar o usuário responsável por criar a Requisicao em cada requisição.

1 curtida

**[quote=“lucastody, post:8, topic:389215, full:true”]
Nem um nem outro. Vc precisa entender a relação entre POSSUI UM e É UM. Nesse caso, penso que uma Requisicao possui um Usuario:

public class Requisicao {
	private Long id;
	private Usuario solicitante;
	// ... demais campos da requisição
	
	// getters e setters
}

Seguindo isso, basta retornar o usuário responsável por criar a Requisicao em cada requisição.
[/quote]

**

aaa sim, mesmo usuario criando a requisição
a requisição possui um usario?

ou usuario possui uma requisição kk
eu n consigo entender oq mudaria

no caso eu teria que fazer assim na list:
solicitante.setId(rs.getLong(“idusuario”));
?

e uma outra dúvida eu preciso usar extends em meus DAO
exemplo
usuarioDAO extends Usuario?

Nesse caso, um usuário pode ter mais de uma requisição. Eu como usuário, posso criar N requisições.

Seu código ficará algo assim:

while(rs.next()) {
	Usuario solicitante = new Usuario();
	solicitante.setId(rs.getLong("idusuario"));
	
	Requisicao req = new Requisicao();  
	req.setId(rs.getLong("id"));
	req.setNome(rs.getString("nome"));
	req.setData(rs.getDate("data_requisicao"));
	req.setMotivo(rs.getString("Observacao"));
	req.setSolicitante(solicitante);
	
	requisicoes.add(req);

Lembrando que o Usuário terá apenas o ID, todos os outros campos continuarão nulos.

e como eu conseguiria passar esse solicitante para a lista?

Qual lista?

public List<Requisicao> getList() {
    List<Requisicao> requisicoes = new ArrayList<>();
    String sql = "SELECT * FROM computador_requisicao";
    try {
        PreparedStatement stmt = con.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {
            Requisicao req = new Requisicao();  
            Usuario user = new Usuario();
            req.setId(rs.getLong("id"));
            user.setId(rs.getLong("idusuario"));
            req.setNome(rs.getString("nome"));
            req.setData(rs.getDate("data_requisicao"));
            req.setMotivo(rs.getString("Observacao"));
            requisicoes.add();
        }
        stmt.close();
        rs.close();
    } catch (SQLException ex) {
        return null;
    }
    return requisicoes;
}

tudo isso faz parte de uma lista ( pois como eu falei eu quero pegar todos os dados do banco de dados, na tabela requisições.)

Basta adicionar a requisição na lista (List<Requisicao> requisicoes) e retornar ela.

no caso

	Usuario solicitante = new Usuario();
	solicitante.setId(rs.getLong("idusuario"));
	Requisicao req = new Requisicao();  
	req.setId(rs.getLong("id"));
	req.setNome(rs.getString("nome"));
	req.setData(rs.getDate("data_requisicao"));
	req.setMotivo(rs.getString("Observacao"));
	req.setSolicitante(solicitante);
	requisicoes.add(req);

eu não estaria adicionando o campo solicitante a lista
requisicoes.add(req); pois só está adicionando o req.

Isso. Ao adicionar o usuario na requisicao, vc jah consegue acessar ele de outros lugares (pois, lembre-se, a requisicao possui um usuario)

1 curtida

eu entendi essa parte, mas tipo desse jeito no meu tableview não iria aparecer o id do usuario
pq eu não adicionei isso a lista.

Adicionou. O id está dentro da requisição dentro do atributo solicitante (que é um Usuario). Para pegar o id do usuario, por exemplo, vc conseguiria asism: requisicoes.get(0).getSolicitante().getId().

Como você está montando essa tableview?

@FXML
private TableView<Requisicao> tb;
@FXML
private TableColumn<Requisicao, Long> clmid;
@FXML
private TableColumn<Requisicao, Long> clmIdUser;
@FXML
private TableColumn<Requisicao, String> clmNome;
@FXML
private TableColumn<Requisicao, Date> clmDate;
@FXML

public void initTable() {

    clmid.setCellValueFactory(new PropertyValueFactory("id"));
    clmIdUser.setCellValueFactory(new PropertyValueFactory("id"));
    clmNome.setCellValueFactory(new PropertyValueFactory("nome"));
    clmDate.setCellValueFactory(new PropertyValueFactory("dataEntrada"));
    clmMotivo.setCellValueFactory(new PropertyValueFactory("motivo"));
    tb.setItems(atualizarTabela());
    
}
public ObservableList<Requisicao> atualizarTabela() {
    RequisicaoDAO dao = new RequisicaoDAO();
    requisicoes = FXCollections.observableArrayList(dao.getList());
    return requisicoes;
}

eu montei ela assim

Pelo que pesquisei, é algo mais ou menos assim:

clmIdUser.setCellValueFactory(new Callback<CellDataFeatures<Requisicao, Long>, ObservableValue<Long>>() {
    @Override
    public ObservableValue<Long> call(CellDataFeatures<Requisicao, Long> data) {
		return data.getValue().getSolicitante().getId();
	}
});
1 curtida