Left join com Criteria

3 respostas
J

Pessoal,

Estou começando a usar o hibernate agora e nunca fiz nenhum consulta usando o criteria, gostaria de saber se vocês podem me ajduar? Já dei uma pesquisada na internet, mas fiquei confuso.

Tenho a seguinte query:

Como escreve-la com Criteria?

3 Respostas

J

Alguma ajuda?

marcelo.bellissimo

[code]Criteria criteria = session.createCriteria(Usuario.class);
criteria.createCriteria("tipousuario").add(Restrictions.eq("codigo", 1));
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);[code]

Tenta isso... to chutando os seus mapeamentos... se der errado, manda ai os seus mapeamentos de usuario e tipousuario ...

J

Marcelo, valeu pela ajuda, mas nao testei ainda não, justamente porque estou com problemas no meu mapeamento.
Seguinte: minha tabela usuario tem um campo chamado tipo_usuario_codigo, que está ligado ao campo codigo da tabela tipo_usuario. Ambos os campos são do tipo integer (tanto codigo quanto tipo_usuario_codigo), até aí tudo bem, certo?
As minhas entidades estão assim:

Usuario
@Entity
@Table(name = "usuario", schema = "catalogo")
public class Usuario implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "codigo")
    private Integer codigo;
    @Basic(optional = false)
    @Column(name = "login")
    private String login;
    @Basic(optional = false)
    @Column(name = "senha")
    private String senha;
    @Column(name = "nome")
    private String nome;
    @JoinColumn(name = "tipo_usuario_codigo", referencedColumnName = "codigo")
    @ManyToOne(optional = false)
    private TipoUsuario tipoUsuarioCodigo;
TipoUsuario
@Entity
@Table(name = "tipo_usuario", schema = "catalogo")
public class TipoUsuario implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "codigo")
    private Integer codigo;
    @Basic(optional = false)
    @Column(name = "tipo")
    private String tipo;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "tipoUsuarioCodigo")
    private Collection<Usuario> usuarioCollection;

O problema é: como setar Usuario.tipoUsuario para depois persistir meu objeto usuario no BD? Não sei como fazer isso, na minha classe usuario tenho um atributo do tipo TipoUsuario, mas na minha tabela usuario, o meu campo é do tipo integer.
Quando eu faço isso na minha servletUsuario me retorna erro:

String login = request.getParameter("login");
            String senha = request.getParameter("senha");
            String nome  = request.getParameter("nome");
            int    tipo  = Integer.parseInt(request.getParameter("tipo"));
            tipoUsuarioDao = new TipoUsuarioDAO(session);
            
            usuario.setLogin(login);
            usuario.setSenha(senha);
            usuario.setNome(nome);
            usuario.setTipoUsuarioCodigo(tipoUsuarioDao.Procurar(tipo));

            try {
                usuarioDao = new UsuarioDAO(session);
                usuarioDao.Inserir(usuario);
                transaction.commit();
            }
            catch (Exception e) {
                out.println ("Não salvou: " + e.getMessage());
                transaction.rollback();
            }
            finally {
                session.flush();
                session.close();
            }
Criado 1 de fevereiro de 2010
Ultima resposta 2 de fev. de 2010
Respostas 3
Participantes 2