Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Como seria a jpql?

Boa tarde tenho um cadastro de agendamento, e nesse agendamento pode ter varios serviços, irei postar as classes aqui para poderem entender melhor.

@Entity
@SuppressWarnings("serial")
public class Agendamento implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    @ManyToOne
    @JoinColumn(name = "carro_codigo")
    private Carro carro = new Carro();
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "servico_codigo")
    private List<Servico> servicos = new ArrayList<Servico>();
    private Date dataComeco;
    private Date dataFim;
    private String observacao;
    private Boolean status;
@SuppressWarnings("serial")
@Entity
public class Agendamento_servico implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long codigo;
    @ManyToOne
    @JoinColumn(name = "Agendamento_codigo")
    private Agendamento agendamento = new Agendamento();
    @ManyToOne
    @JoinColumn(name = "servicos_codigo")
    private Servico servico = new Servico();

Oque eu quero fazer? tenho o meu componente do primefaces shadule uma coisa assim de agenda, quando vou cadastrar uma agenda, eu posso ter mais de um servio, e quando eu marco uma agenda, mostra no componente oque eu gravei no banco de dados, e uma coisa que eu quero mostrar, é por exemplo clicar lá em UMA agenda salva e mostrar apenas as consultas que eu realizei dessa agenda, deu para enteder? O meu select está assim.

@SuppressWarnings("unchecked")
    public List<Agendamento_servico> lista(Long codigo) {
        return this.manager
                .createQuery(
                        "Select a from Agendamento_servico a where a.servico.codigo = :codigo")
                .setParameter("codigo", codigo)
                .getResultList();
    }

depois quando eu chamo ele para fazer parte do meu html fica assim.

@Transacional
    public List<Agendamento_servico> getListaAgendamentos() {
        System.out.println("Tamanho da lista: " + agendamentoServicoDao.lista(this.servico.getCodigo()));
        return agendamentoServicoDao.lista(agendamentoServico.getServico()
                .getCodigo());
    }

E não tive resultado no meu html... está correto?

4 respostas

Alguém?

Alisson, boa tarde.

Não ficou muito claro para mim o que é essa classe Agendamento_Servico

Pois nela você tem um agendamento e um Serviço E no agendamento você tem uma lista de serviços.

O que você quer representar com Agendamento_Servico?

solução!

Opa fala ai Furtado tudo beleza? Cara é o seguinte, vou tentar ser o mais claro possivel, não so muito bom em expressar kkk. A classe não ficou claro para você? Então ta, primeiro tenho a minha classe Agendamento correto?

@Entity
@SuppressWarnings("serial")
public class Agendamento implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    @ManyToOne
    @JoinColumn(name = "carro_codigo")
    private Carro carro = new Carro();
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "servico_codigo")
    private List<Servico> servicos = new ArrayList<Servico>();
    private Date dataComeco;
    private Date dataFim;
    private String observacao;
    private Boolean status;

Como a relação do atributo é manyToMany do objeto servico.

 @ManyToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "servico_codigo")
    private List<Servico> servicos = new ArrayList<Servico>();

Por causa de ser manuytomany irá acabar gerando uma tabela associativa no meu banco com o nome. Agendamento_servico, ai eu ja quiz aproveitar essa tabela e criar uma no java, e acabei criando a tabela com o mesmo nome com a do a banco.

@SuppressWarnings("serial")
@Entity
public class Agendamento_servico implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long codigo;
    @ManyToOne
    @JoinColumn(name = "Agendamento_codigo")
    private Agendamento agendamento = new Agendamento();
    @ManyToOne
    @JoinColumn(name = "servicos_codigo")
    private Servico servico = new Servico();

Essa tabela seria como itens ou ordem de serviço, porque? oque eu estou fazendo é pegar um componente do meu primefaces o shedule que é um calendario, e quando eu clico em uma data ele abre uma dialog e eu gravo o meu agendamento lá, tirando o meu

 private List<Servico> servicos = new ArrayList<Servico>();

Aqui eu não salvo nada, eu deixo pra savar os meus serviço na tabela associativa, como itens de serviço entendeu? Não sei se ficou claro, mais irei postar o codigo que eu acho que sera melhor de enteder.

    public void adicionarServico() {
        agendamentoServicos.add(agendamentoServico);
        System.out.println("Tamanho da lista: "
                + this.agendamentoServicos.size());
        precoTotalServico();
        agendamentoServico = new Agendamento_servico();
        precoTotalServico();
    }

Nesse metodo eu adiciono os meus serviço quando clico em uma data, porque eu posso ter mais de um serviço em um agendamento.

@Transacional
    public void salvar() {
        if (agendamento.getCodigo() == null) {
            agendamentoDao.salvar(agendamento);
            Agendamento agendaCodigo = agendamentoDao
                    .buscarPorCodigo(agendamento.getCodigo());
            for (Agendamento_servico a : agendamentoServicos) {
                a.setAgendamento(agendaCodigo);
                agendamentoServicos = new ArrayList<Agendamento_servico>();
                agendamentoServicoDao.salvar(a);
            }
            Mensagem.mensagemInfo("Agendamento realizado com sucesso");
        } else {
            Mensagem.mensagemInfo("Agenda atualizada com sucesso");
        }
        this.agendamento = new Agendamento();
        this.agendamentoServico = new Agendamento_servico();
        agendamentoServicos = new ArrayList<Agendamento_servico>();
    }

Aqui estou salvando meu agendamento e o meu Agendamento_servico correto?

Acho que ficou mais claro, eu não uso o meu.

private List<Servico> servicos = new ArrayList<Servico>();

Só uso mesmo para gerar a tabela associativa.

Tá oque eu quero fazer? Quando eu salvo um agendamento no meu componente fica mostrando no dia em que salvei os detalhes do agendamento, tipo valor a data e assim por diante. Mais oque quero mostrar também é quando clicar em um agendamento salvo mostrar minha lista de serviço apenas do agendamento que eu cliquei entendeu? Só que eu fiz assim, já mudei e não tive resultado.

@SuppressWarnings("unchecked")
    public List<Agendamento_servico> lista(Long codigo) {
        return this.manager
                .createQuery(
                        "Select a from Agendamento_servico a where a.agendamento.codigo = :codigo")
                .setParameter("codigo", codigo)
                .getResultList();
    }

ai no meu bean quando faço a ligação com o dao.

@Transacional
    public List<Agendamento_servico> getTeste() {
        List<Agendamento_servico> agendaServicos = agendamentoServicoDao
                .lista(this.agendamentoServico.getAgendamento().getCodigo());
        System.out.println("Tamanho da lista: " + agendaServicos.size());
        return agendamentoServicoDao.lista(agendamentoServico.getAgendamento()
                .getCodigo());
    }

Não tenho nenhum resultado, eu acho que estou errando no meu parametro na hora de passar, porque quando eu eu setto o paramentro com um exemplo salvo no banco de dados passando assim por exemplo, ele me mostra certo.

@Transacional
    public List<Agendamento_servico> getTeste() {
        List<Agendamento_servico> agendaServicos = agendamentoServicoDao
                .lista(1L);
        System.out.println("Tamanho da lista: " + agendaServicos.size());
        return agendamentoServicoDao.lista(1L);
    }

Quando passo um codigo salvo no banco ele me retorna oque eu quero, então eu devo tar errando algo no meu parametro :(, deu para entender?

Resolvido já, como te disse tava errando no meu parametro kkkk. vlw a atenção.