Olá pessoa. Sou novo nesse mundo de Spring, Hibernate, HQL, JPA, etc. Por isso me desculpem pela dúvida que poderá parecer um tanto quanto simples.
Tenho as seguintes tabelas:
@Repository
public class AutenticacaoDAOImpl implements AutenticacaoDAO {
@PersistenceContext
private EntityManager manager;
@Override
public List<Usuario[]> obterUsuarioPeloLogin(LoginDTO loginDTO) {
String hql = "from Usuario";
Query query = manager.createQuery(hql);
List<Usuario[]> listResult = query.getResultList();
/*for (Usuario[] row : listResult) {
Usuario usuario = row[0];
}*/
return listResult;
}
}
Não tenho problema com paramêtros mas sim em fazer o JOIN. Por padrão o Hibernate retorna os objetos conforme o mapeamento.
Nesse caso abaixo, um select simples na tabela Usuario ele está me retornando a tabela Pessoa e PessoaFisica, porém não a Academico que contém o id (chave primária) que futuramente seria a matrícula.
Enfim preciso fazer o JOIN entre a PessoaFisica e a Academico.
Agradeço desde já a ajuda.
O que você precisa buscar, exatamente?
Em específico, a busca
FROM Usuario
Retornará todos os objetos da classe Usuario já preenchidos (isso inclui os atributos que são outros objetos). Não me recordo, mas, tem a ver com mapeamento como EAGER ou LAZY para o fetch mode.
Pelo que entendi do teu DER (e isso não é lá aquelas coisas para entender relação entre objetos), academico é um objeto à parte, ele contém uma pessoa física, isso? se é, então o mesmo deve funcionar para
FROM Academico
Caro Darlan, o LoginDTO contém matricula e senha. A matricula seria a primary key da tabela Academico (futuramente alterarei isso rsrs), já a senha está na tabela Usuario.
Sobre o mapeamento ser EAGER ou LAZY, atualmente tenho o seguinte:
Usuario:
@Id
@Column(name = “id_usuario”)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = “id_pessoa_fisica”)
private PessoaFisica pessoaFisica;
Academico:
@Id
@Column(name = “id_academico”)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = “id_pessoa_fisica”)
private PessoaFisica pessoaFisica;
Pessoa:
@Id
@Column(name = “id_pessoa”)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = “nome_pessoa”)
private String nomePessoa;
PessoaFisica:
@Id
@Column(name = “id_pessoa_fisica”)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = “id_pessoa”)
private Pessoa pessoa;
Cara, sendo bem sincero, está bem confuso.
Primeiro, não entendi a razão pela qual você faz uma relação ManyToOne entre acadêmico e pessoa física. É para ter distinção da matrícula e poder ter o mesmo aluno matriculado em mais de um curso?
Poderia criar uma tabela de autenticação, isolada de todas, mas, ok.
Bom, basicamente, fica algo:
FROM Academico a JOIN a.pessoaFisica pf WHERE a.id = ?1 AND pf.senha = ?2
Isso deve resolver.
Sim Darlan. O modelo anexado não está completo.
Obrigado pela ajuda. Deu certo!