Olá turma, tudo bem??
Estou fazendo um pequeno sistema voltado para educação e estou tendo um pequeno problema numa query. O problema está relacionado a tres tabelas: Tabela de Login, Tabela de Aluno e tabela de Professor…
Qdo alguem for logar no sistema, informará usuário e senha. Encontrado o usuario e senha, será verificado num campo da tabela Login que tipo de usuário terei: se for aluno, recupero o Aluno da tabela Aluno; se for professor, recupero o professor da tabela professor…
Tendo o Login, precisarei fazer um select na tabela de Aluno ou Professor pela ID do login, algo como:
SELECT * FROM TB_ALUNO WHERE LOGIN_ALUNO = [ID_LOGIN]
Mas como fazer isso com JPA?[code]
Segue minhas tabelas:
CREATE TABLE TB_LOGIN(
[ID] [int] IDENTITY(1,1) NOT NULL,
[USUARIO_LOGIN] [VARCHAR](20),
[SENHA_LOGIN] [VARCHAR](20),
[TIPO_USUARIO_LOGIN] [VARCHAR](20),
CONSTRAINT [PK_LOGIN] PRIMARY KEY (ID)
)
CREATE TABLE TB_ALUNO(
[ID] [int] IDENTITY(1,1) NOT NULL,
[NOME_ALUNO] [VARCHAR](50) NOT NULL,
[MATRICULA_ALUNO] [varchar](10),
[ENDERECO_ALUNO] [INT],
[SEXO_ALUNO] [VARCHAR](1),
[RG_ALUNO] [VARCHAR](20),
[CPF_ALUNO] [VARCHAR](20),
[DATA_NASC_ALUNO] [SMALLDATETIME],
[TEL_RESIDENCIAL_ALUNO] [VARCHAR](15),
[TEL_CELULAR_ALUNO] [VARCHAR](15),
[EMAIL_ALUNO] [VARCHAR](100),
[TURMA_ALUNO] [int] NULL,
[SITUACAO_ALUNO] [int] NULL,
[LOGIN_ALUNO] [INT],
CONSTRAINT [PK_ALUNO] PRIMARY KEY (ID),
CONSTRAINT [FK_TURMA_ALUNO] FOREIGN KEY(TURMA_ALUNO) REFERENCES TB_TURMA(ID),
CONSTRAINT [FK_LOGIN_ALUNO] FOREIGN KEY (LOGIN_ALUNO) REFERENCES TB_LOGIN(ID)
)
CREATE TABLE TB_PROFESSOR(
[ID] [int] IDENTITY(1,1),
[registroprofessor_PROFESSOR] [varchar](10),
[NOME_PROFESSOR] [VARCHAR](50) NOT NULL,
[SEXO_PROFESSOR] [VARCHAR](1),
[ENDERECO_PROFESSOR] [INT],
[RG_PROFESSOR] [VARCHAR](14),
[CPF_PROFESSOR] [varchar](14),
[DATA_NASC_PROFESSOR] [SMALLDATETIME],
[TEL_RESIDENCIAL_PROFESSOR] [VARCHAR](15),
[TEL_CELULAR_PROFESSOR] [VARCHAR](15),
[EMAIL_PROFESSOR] [VARCHAR](100),
[LOGIN_PROFESSOR] [INT]
CONSTRAINT [pk_professor] PRIMARY KEY (ID),
CONSTRAINT [FK_LOGIN_PROFESSOR] FOREIGN KEY (LOGIN_PROFESSOR) REFERENCES TB_LOGIN(ID)
)
segue minhas entidades:
@Entity
@Table(name="TB_LOGIN")
//@AttributeOverride(name="id", column= @Column(name="ID_LOGIN"))
public class Login implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Integer id;
@Column(name="USUARIO_LOGIN")
private String usuario;
@Column(name="SENHA_LOGIN")
private String senha;
@Column(name="TIPO_USUARIO_LOGIN")
private String tipoUsuario;
// getters and setters
@Entity
@Table(name="TB_ALUNO")
@AttributeOverrides({
@AttributeOverride(name="id", column=@Column(name="ID_ALUNO")),
@AttributeOverride(name="nome", column=@Column(name="NOME_ALUNO")),
@AttributeOverride(name="sexo", column=@Column(name="SEXO_ALUNO")),
@AttributeOverride(name="rg", column=@Column(name="RG_ALUNO")),
@AttributeOverride(name="cpf", column=@Column(name="CPF_ALUNO")),
@AttributeOverride(name="dataNascimento", column=@Column(name="DATA_NASC_ALUNO")),
@AttributeOverride(name="email", column=@Column(name="EMAIL_ALUNO"))
})
public class Aluno extends Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name="MATRICULA_ALUNO")
private String matricula;
@Column(name="TEL_RESIDENCIAL_ALUNO")
private String telefoneResidencial;
@Column(name="TEL_CELULAR_ALUNO")
private String telefoneCelular;
@ManyToOne
@JoinColumn(name="TURMA_ALUNO")
private Turma turma;
@OneToOne
@JoinColumn(name="LOGIN_ALUNO")
private Login login;
//getters and setters
@Entity
@Table(name="TB_PROFESSOR")
@AttributeOverrides({
@AttributeOverride(name="id", column=@Column(name="ID_PROFESSOR")),
@AttributeOverride(name="nome", column=@Column(name="NOME_PROFESSOR")),
@AttributeOverride(name="sexo", column=@Column(name="SEXO_PROFESSOR")),
@AttributeOverride(name="rg", column=@Column(name="RG_PROFESSOR")),
@AttributeOverride(name="cpf", column=@Column(name="CPF_PROFESSOR")),
@AttributeOverride(name="dataNascimento", column=@Column(name="DATA_NASC_PROFESSOR")),
@AttributeOverride(name="email", column=@Column(name="EMAIL_PROFESSOR"))
})
public class Professor extends Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name="REGISTROPROFESSOR_PROFESSOR")
private String registroProfessor;
@Column(name="TEL_RESIDENCIAL_PROFESSOR")
private String telefoneResidencial;
@Column(name="TEL_CELULAR_PROFESSOR")
private String telefoneCelular;
@OneToOne
@JoinColumn(name="LOGIN_PROFESSOR")
private Login login;
//getters and setters
Meus DAOs
public class LoginDAO extends GenericDAO<Login, Integer> implements Serializable{
public Pessoa entrar(Login l) {
try {
EntityManager em = getEntityManager();
String query = "SELECT l FROM Login l WHERE l.usuario = "
+ ":usuario AND l.senha = :senha";
Query q = em.createQuery(query);
q.setParameter("usuario", l.getUsuario());
q.setParameter("senha", l.getSenha());
//String r = salvar(l);
Login novoLogin = (Login) q.getSingleResult();
if(novoLogin.getTipoUsuario().equals(TipoUsuario.ALUNO.toString()))
return new AlunoDAO().findByLogin(novoLogin);
else
return new ProfessorDAO().findByLogin(novoLogin.getId());
} catch(Exception ex) {
ex.printStackTrace();
return null;
} finally {
close();
}
}
}
E conforme o tipo de usuário ele buscaria a Entidade de aluno ou professor
Embaixo o DAO para aluno (O dao para professor segue o mesmo principio, soh muda a entidade)… tentei fazer uma query como segue abaixo mas não vingou…
public class AlunoDAO extends GenericDAO<Aluno, Integer> implements Serializable{
public Aluno findByLogin(int idLogin) {
EntityManager em = getEntityManager();
try {
String query = "SELECT a FROM Aluno a WHERE a.login.id = :login";
Query q = em.createNativeQuery(query);
q.setParameter("login", idLogin);
return (Aluno) q.getSingleResult();
} catch(Exception ex) {
return null;
} finally {
em.close();
}
}
}
Desde já agradeço a ajuda
att.
Junior