Olá pessoal, boa tarde.
Estou desenvolvendo um projeto onde existe uma composição de classes profunda e estou tendo alguns problemas para fazer consultas.
Essa profundidade se dá pelo fato de que as classes são o mapeamento de um arquivo XML que possui muitos níveis (padrão IEEE LOM para metadados de objetos de aprendizagem)
A ferramenta que eu estou desenvolvendo irá criar objetos de aprendizagem (simplificando, conteúdo eletrônico para aprendizado) e cada objeto pode conter metadados para que sejam qualificados.
Exemplo: Quero fazer uma consulta que me traga todos os materiais que contenham a palavra “crise” como título. O título é um campo de metadado.
HQL:
Para fazer isso, crio uma subquery que me retorna todas as LangStrings que tenham como valor a palavra crise ou qualquer coisa que tenha crise no meio. Verifico quais dos resultados da subquery estão dentro do conjunto strings (classe LangString), que faz parte de title (classe GeneralTitle), que está contido em general (classe General) que por sua vez esá contido em lom (classe Lom) que está em metadata (classe Metadata) que por fim está na classe Material. Não é muito complicado, o problema é a quantidade de níveis que tem a composição. A função elements da HQL faz todos os joins automaticamente para retornar o que eu quero.
A query funciona caso a subquery retorne apenas um resultado (óbvido), mas quando a subquery retorna mais de um resultado dá problema pois não consigo comparar dois conjuntos com o operador “in”.
Queria saber se algum de vocês já tiverem esse problema. Se sim, como resolveram? Alguém conhece uma outra alternativa? Fiz a query com theta-style joins mas fica muuuuuuuuito mais complicada e o código fica nojento. Eu poderia ter optado por colocar esses campos de metadados dentro da classe Material por exemplo, mas infelizmente se eu fizesse isso iria complicar muito a geração de xml através dos objetos de metadados.
Espero não ter sido muito enrolada a explicação.
Muito obrigado!