Olá a todos, tudo bem?
Estou com um problema para formular uma pesquisa utilizando Criteria.
Tenho as seguintes classes:
User
@Entity
@Table(name="user")
public class User implements Serializable, UserDetails {
private static final long serialVersionUID = -8451679170281063697L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
private Long id;
@ManyToMany(cascade={ CascadeType.ALL, CascadeType.MERGE })
@JoinTable(name="user_cargo",
joinColumns = @JoinColumn(name="user_id" , referencedColumnName="id"),
inverseJoinColumns = @JoinColumn(name="cargos_id" , referencedColumnName="id"))
private List<Cargo> cargos;
...
Cargo
@Entity
@Table(name="cargo")
public class Cargo implements Serializable {
private static final long serialVersionUID = 1886820991361556707L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
private Long id;
private String nome;
...
Quando o Hibernate mapeia estas classes ele cria a tabela no banco user_cargo com as colunas user_id e cargos_id.
Minha dúvida: a partir do id do usuário preciso consultar e retornar uma lista de nomes do(s) cargo(s) que o User possui.
Usando o SQL consigo fazendo assim:
select cargo.nome from cargo inner join user_cargo where user_id = ?;
Alguém tem ideia de como ficaria usando Criteria?
Meu método atual, conforme abaixo, esta errado. Ele compara o id do usuário diretamente com id dos cargos, não passando por essa tabela user_cargo que o Hibernate criou.
public Cargo buscarCargoPorId(long id){
if (!session.isOpen()) {
session = sessionFactory.openSession();
}
Criteria criteria = session.createCriteria(Cargo.class);
criteria.add(Restrictions.eq("id",id));
Cargo cargo = (Cargo) criteria.uniqueResult();
if (session.isOpen()) {
session.close();
}
return cargo;
}
Muito obrigado.
Abraços.