[FECHADO] Hibernate Query Language - Um Select simples

4 respostas Resolvido
jpajavaspringhibernate
L

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.

4 Respostas

D

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
L

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:

<strong>Usuario:</strong>

@Id

@Column(name = “id_usuario”)

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id;
@ManyToOne

@JoinColumn(name = id_pessoa_fisica)

private PessoaFisica pessoaFisica;
<strong>Academico:</strong>

@Id

@Column(name = “id_academico”)

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id;
@ManyToOne

@JoinColumn(name = id_pessoa_fisica)

private PessoaFisica pessoaFisica;
<strong>Pessoa:</strong>

@Id

@Column(name = “id_pessoa”)

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id;

@Column(name = “nome_pessoa”)
private String nomePessoa;

<strong>PessoaFisica:</strong>

@Id

@Column(name = “id_pessoa_fisica”)

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id;
@ManyToOne

@JoinColumn(name = id_pessoa)

private Pessoa pessoa;
D
Solucao aceita

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.

L

Sim Darlan. O modelo anexado não está completo.
Obrigado pela ajuda. Deu certo!

Criado 14 de fevereiro de 2018
Ultima resposta 14 de fev. de 2018
Respostas 4
Participantes 2