Boa tarde, galera!
É o seguinte, eu preciso saber como que eu faço para fazer um select em múltiplas entidades mapeadas com jpa 2.0 e utilizando hibernate.
Seria um select para validar uma entrada de login de um usuario.
No caso eu tenho uma tabela Cliente, que herda de Pessoa.
E na minha tabela Login, eu possuo um Cliente.
@Entity
@Table(name = "cliente")
@PrimaryKeyJoinColumn(name = "id")
public class ClienteDTO extends Pessoa implements Serializable {
private static final long serialVersionUID = 9057647385901589752L;
@OneToOne(mappedBy="cliente", cascade=CascadeType.ALL)
private LoginDTO login;
public ClienteDTO() {
}
//get set
}
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@SequenceGenerator(name = "PESSOA_SEQ", sequenceName = "s_pessoa", initialValue = 1000, allocationSize = 20)
public abstract class Pessoa implements Serializable {
private static final long serialVersionUID = 5777501399478522675L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PESSOA_SEQ")
@Column(unique = true, nullable = false, updatable = false)
private Long id;
private String nome;
private String email;
private String cpf;
public Pessoa() {
}
//get set
}
@Entity
@Table(name = "login")
@NamedQueries({
@NamedQuery(name = "obterUsuarioPorUsuarioSenha", query = "select l from LoginDTO where l.usuario = :usuarioParam and l.senha = :senhaParam"),
})
public class LoginDTO implements Serializable {
private static final long serialVersionUID = 1718733412549158088L;
@Id
@Column(nullable = false)
@GeneratedValue(generator = "gen")
@GenericGenerator(name = "gen", strategy = "foreign", parameters = @Parameter(name = "property", value = "cliente"))
private Long idLoginCliente;
@OneToOne(fetch=FetchType.LAZY)
@PrimaryKeyJoinColumn
private ClienteDTO cliente;
@Column(unique = true, nullable = false)
private String usuario;
@Column(nullable = true)
private String senha;
public LoginDTO() {
}
// get set
}
O meu banco foi gerado da seguinte forma:
______________
| Tabela cliente |
|_____________|
|_____id______ |
===========
|____1000_____|
--------------------
_________________________________________________________________________________
|______________________________ Tabela pessoa _____________________________________|
|_____________|_____________________|______________________|______________________|
|_____ id _____ |________nome ________|________ email ________|________ cpf__________ |
==================================================================
|____1000_____|________ ABC ________ |_____ [email removido] __ |____165165165151651___|
------------------------------------------------------------------------------------------------------------------
____________________________________________________________
|________________________ Tabela login ________________________|
|_____________|_____________________|_______________________|
|_ idlogincliente_|_____ usuario _________|_________senha_________|
================================================
|____1000_____|______admin__________|_____8c48747q4s9c4q65___|
------------------------------------------------------------------------------------
Como vocês viram, estou usando @NamedQuery na entidade do Login..
A camada web chama um ejb com o seguinte método:
public LoginDTO efetuarLogin(LoginDTO usuarioDTO) throws Exception {
Query q = em.createNamedQuery("obterUsuarioPorUsuarioSenha");
q.setParameter("usuarioParam", usuarioDTO.getUsuario());
q.setParameter("senhaParam", usuarioDTO.getSenha());
try {
return (LoginDTO) q.getSingleResult();
} catch (NoResultException ne) {
throw new NoResultException(ne.getMessage());
}
}
O problema é que eu não sei estou conseguindo fazer a query que valide os dados do login...
Neste caso, eu tenho o seguinte retorno:
Caused by: javax.persistence.NoResultException: No entity found for query [code]
Será que é um problema causado pelo FETCH? Ou seria por conta de uma das classes serem abstradas? Ou minha query está errada?
Já tentei de tudo.. Se alguém puder ajudar, ficarei super agradecido.
Ansioso por respostas,
Abraço!!