Subquery

Opa pessoal, beleza?

Eu gostaria de saber se há como fazer subqueries em jpql, pois não estou conseguindo fazer uma consulta com a seguinte query:

Query q = em.createQuery("select object(o) from Ordens as o where o not in (select object(ob) from Faturas as ob)");

também ja tentei

Query q = em.createQuery("select object(o) from Ordens as o where o.id not in (select object(ob) from Faturas as ob)");

A query deve retornar as Ordens que não estão nas Faturas.

Se puderem me ajudar, li em algum lugar que não dava pra fazer joins e subqueries mas não tenho certeza.

Abraços

http://openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/manual/jpa_langref.html#jpa_langref_subqueries

tente not existis.

Ow, poste suas classes fatura e ordens e faturas,

voce tem que comparar elementos do mesmo tipo na sua query

select object(o) from Ordens as o where o.id not in (select object(ob) from Faturas as ob)

nesse caso voce comparou um id (provavelmente um numerico) com um objeto do tipo faturas

voce deve comparar tipo numerico com outro tipo numerico ou tipo string com outro tipo string … se nao nao vai dar certo, mesmo usando o not exist como sugerido pelo wbdsjunior.

obg pelas dicas.

marcia, eu testei o seguinte:

Query q = em.createQuery("select object(o) from Ordem as o where o not exists (select object(ob.ordem) from Fatura as ob");

deu o mesmo erro.

Seguem esboço das classes Ordem e Fatura.

public class Fatura implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="Fatura")
    private Long id;
    private String nome;
    @OneToOne
    private Ordem ordem;
    private int status;
    @ManyToOne
    private Motorista motorista;
public class Ordem implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Ordem")
    private Long id;
    @Version
    private long version;
    @ManyToMany
    private List<Produtos> produtos;
    @ManyToOne
    private Cliente cliente;
    @ManyToOne
    private Loja loja;
    private Long total;

Oi, tenta assim:

qualquer coisa posta a exception que esta dando.

Se voce somente quer listar as ordens que possuam faturas, porque nao dar um select em fatura, pegando através de join a ordem correspondente ?

Query q = em.createQuery("SELECT o FROM Fatura f inner join f.ordem o ");

esquece … :oops: acabei de ver que você quer justamente o contrário :lol:

Se a relação é one to one, porque não a tens também na classe factura?

Marcia, funcionou a query que você passou! Muito obrigado mesmo! Retornou exatamente o que eu estava querendo.
trouxa as ordens que não estavam em faturas! :thumbup:

Obrigadão ;D!

pmlm, o que acontece é que a classe Ordens é de um outro sistema e já estava pronta, então eu simplesmente utilizo a tabela do bd
do outro sistema para criar os registros da tabela Faturas, saca?

Valeu pela ajuda pessoal!
Abraços!