Selecionar pela chave estrangeira da tabela

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

Eu mesmo acabei encontrando o Problema…

Montei a query de forma correta, mas o problema foi usar

Query q = em.createNativeQuery(query);

ao invés de

Query q = em.createQuery(query);