Fazer uma query polimorfica em entidades relacionadas atraves de heranca e muito simples. Porem as vezes desejamos executar uma query que busque todas as entidades que possuem determinado comportamento em comum, mas que nao sao da mesma hierarquia. Aqui e comum ver o desenvolvedor implementar heranca de maneira erronea, apenas para conseguir esta funcionalidade.Obs: Este topico possui uma otima discussao a respeito de heranca e como ela pode ser prejudicial ao seu codigo.Vamos supor que tenhamos o conceito de notificavel em nosso sistema e queremos buscar por todas as entidades "notificaveis".Como posso ter diversas entidades notificaveis que nao fazem parte de uma hierarquia seria um erro usar heranca. Entao implementamos Notificavel como uma interface.public interface Notificavel { public void notifica();}Suponhamos que temos duas entidades em que serao notificaveis: Sistema e Pessoa.@Entitypublic class Sistema implements Notificavel { ...@Entitypublic class Pessoa implements Notificavel { ...Entao realizamos a busca com a seguinte HQL:String hql = "FROM br.com.renan.domain.Notificavel";Note que colocamos o nome totalmente qualificado da interface, isso e necessario para que o hibernate saiba exatamente por qual interface buscamos.Note que assim voce consegue buscar por todas as entidades que implementem a inteface.E por fim o teste:@Testpublic void deveRetornarDoisVeiculos() { List notificaveis = notificador.lista(); assertEquals(2, notificaveis.size());}Aqui e possivel encontrar o codigo completo do projeto.Abracos. Voce e um programador Java experiente, esta sempre buscando conhecimento e novas formas de encontrar solucoes. Uma forma de atingir este objetivo e aprender uma nova linguagem, preferencialmente com um paradigma diferente. Scala te chama atencao, por funcionar dentro da JVM, usar classes existentes do Java e por ser funcional, um paradigma que voce ainda nao conhece.Entao caro leitor temos muito em comum, na saga de estudar a linguagem e tambem o paradigma funcional, tive a oportunidade de receber a ajuda de um hacker amigo, @JonasAbreu. O coach do Jonas esta sendo fundamental. Fui a minha primeira reuniao dos ScalaDores, o grupo e bem avancado, portanto se voce conhece bem Scala sera um prato cheio, se esta iniciando, tambem nao tem problema, voce acaba tendo um bom aproveitamento.Uma grande questao e que voce nao gostaria de reaprender tudo que ja sabe sobre programacao, orientacao a objetos e etc. Seria interessante se tivesse uma forma de aprender reaproveitando sua experiencia, focando apenas nas novidades e de forma bem pratica.Pensando nisso, comeco a partir deste post, fazer uma serie para programadores Java interessados em aprender Scala. Abordarei tudo de forma muito pratica e bem baseada em coisas que acho importante ou codigo que usei para alguma solucao, MUITO DO CODIGO SERA AUTO EXPLICATIVO. Explicarei a teoria e detalhes quando o codigo nao for tao obvio assim.Para comecar sugiro usar o interpretador de Scala no terminal. Instalar, iniciar o interpretador, tudo isso e bem facil e ja existe bons materiais, portanto nao serao abordados aqui, ao menos nesse primeiro momento.Vamos comecar!VariaveisPara declarar uma variavel basta fazer:var nomeDaVariavel = valorNote que diferente do Java nao precisamos declarar o tipo da variavel, isso porque Scala consegue, muitas vezes, inferir o tipo declarado. Mas caso quisermos declarar o tipo, por questoes de legibilidade por exemplo, podemos fazer:var nomeDaVariavel :