Hibernate.orgCommunity Documentation
O Hibernate3 provê um novo método inovador para manusear dados com regras de "visibilidade". Um Filtro do Hibernate é um filtro global, nomeado e parametrizado que pode ser habilitado ou não dentro de uma Sessão do Hibernate.
O Hibernate3 tem a habilidade de pré-definir os critérios do filtro e anexar esses filtros no nível da classe e no nível da coleção. Um critério do filtro é a habilidade de definir uma cláusula restritiva muito semelhante à função "where" disponível para a classe e várias coleções. A não ser que essas condições de filtros possam ser parametrizadas. A aplicação pode, então decidir, em tempo de execução, se os filtros definidos devem estar habilitados e quais valores seus parâmetros devem ter. Os filtros podem ser usados como Views de bancos de dados, mas com parâmetros dentro da aplicação.
Para usar esses filtros, eles devem inicialmente ser definidos e anexados aos elementos do mapeamento apropriados. Para definir um filtro, use o elemento <filter-def/>
dentro do elemento <hibernate-mapping/>
:
<filter-def name="myFilter">
<filter-param name="myFilterParam" type="string"/>
</filter-def
>
Esse filtro pode ser acoplado à uma classe:
<class name="myClass" ...>
...
<filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
</class
>
Ou, à uma coleção:
<set ...>
<filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
</set
>
Ou, mesmo para ambos (ou muitos de cada) ao mesmo tempo.
Os métodos na Session
são: enableFilter(String filterName)
, getEnabledFilter(String filterName)
e disableFilter(String filterName)
. Por padrão, os filtros não são habilitados dentro de qualquer sessão. Eles devem ser explicitamente habilitados usando o método Session.enabledFilter()
, que retorna uma instância da interface Filter
. Usando o filtro simples definido acima, o código se pareceria com o seguinte:
session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");
Veja que os métodos da interface org.hibernate.Filter permite o encadeamento do método, comum à maioria das funções do Hibernate.
Um exemplo completo, usando dados temporais com um padrão de datas de registro efetivo:
<filter-def name="effectiveDate">
<filter-param name="asOfDate" type="date"/>
</filter-def>
<class name="Employee" ...>
...
<many-to-one name="department" column="dept_id" class="Department"/>
<property name="effectiveStartDate" type="date" column="eff_start_dt"/>
<property name="effectiveEndDate" type="date" column="eff_end_dt"/>
...
<!--
Note that this assumes non-terminal records have an eff_end_dt set to
a max db date for simplicity-sake
-->
<filter name="effectiveDate"
condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
</class>
<class name="Department" ...>
...
<set name="employees" lazy="true">
<key column="dept_id"/>
<one-to-many class="Employee"/>
<filter name="effectiveDate"
condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
</set>
</class
>
Para garantir que você sempre tenha registro efetivos, simplesmente habilite o filtro na sessão antes de recuperar os dados dos empregados:
Session session = ...;
session.enableFilter("effectiveDate").setParameter("asOfDate", new Date());
List results = session.createQuery("from Employee as e where e.salary
> :targetSalary")
.setLong("targetSalary", new Long(1000000))
.list();
No HQL acima, mesmo que tenhamos mencionado apenas uma restrição de salário nos resultados, por causa do filtro habilitado, a consulta retornará apenas os funcionários ativos cujo salário é maior que um milhão de dólares.
Nota: se você planeja usar filtros com união externa (por HQL ou por busca de carga) seja cuidadoso quanto à direção da expressão de condição. É mais seguro configurá-lo para uma união externa esquerda. Coloque o parâmetro primeiro seguido pelo(s) nome(s) da coluna após o operador.
Após ser definido, o filtro deve ser anexado às entidades múltiplas e/ou coleções, cada uma com sua própria condição. Isto pode ser tedioso quando as condições se repetem. Assim, usando o <filter-def/>
permite denifir uma condição padrão, tanto como uma função quanto CDATA:
<filter-def name="myFilter" condition="abc
> xyz"
>...</filter-def>
<filter-def name="myOtherFilter"
>abc=xyz</filter-def
>
Esta condição padrão será utilizada todas as vezes que um filtro for anexado a algo sem uma condição específica. Note que isto significa que você pode dar uma condição específica como parte de um anexo de filtro que substitua a condição padrão neste caso em particular.
Copyright © 2004 Red Hat, Inc.