Olha só, criei o seguinte caso de teste:
id dtInicio dtFim
1 2001-01-01 2002-01-01
2 2001-01-01 2002-05-31
3 2001-01-01 2003-01-01
4 2002-01-01 2003-01-01
5 2002-01-01 2004-01-01
6 2002-01-01 2005-01-01
7 2003-01-01 2003-05-31 *
8 2003-01-01 2005-01-01
9 2004-01-01 2004-05-31
10 2004-01-01 2005-01-01
11 2005-01-01 2005-05-31
12 2005-01-01 2006-01-01
13 2006-01-01 2006-05-31
Para esse intervalo: 2003-01-01 a 2003-05-31
O único aceito seria o id=7
Então primeiro usamos a consulta com as seguintes restrições:
dtInicio <= dtFim And dtFim >= dtInicio
.add(Restrictions.le("dtInicio", fim))
.add(Restrictions.ge("dtFim", inicio))
E teremos todos esses resultados:
id=3, dtInicio=2001-01-01, dtFim=2003-01-01
id=4, dtInicio=2002-01-01, dtFim=2003-01-01
id=5, dtInicio=2002-01-01, dtFim=2004-01-01
id=6, dtInicio=2002-01-01, dtFim=2005-01-01
id=7, dtInicio=2003-01-01, dtFim=2003-05-31 *
id=8, dtInicio=2003-01-01, dtFim=2005-01-01
Então uso mais uma restrição:
dtFim <= dtFim -> Assim elimina todas as datas que tinham a dtFim maior que o parâmetro dtFim
E o resultado passa a ser:
id=3, dtInicio=2001-01-01, dtFim=2003-01-01
id=4, dtInicio=2002-01-01, dtFim=2003-01-01
id=7, dtInicio=2003-01-01, dtFim=2003-05-31 *
Para finalizar, a ultima restrição:
dtInicio >= dtIncio -> Assim eliminamos todas as datas que estariam em um intervalo com dtInicio menor que o parâmetro de dtInicio
E o resultado final:
A consulta então seria essa:
List<SuaClasse> list = getSession().createCriteria(SuaClasse.class)
.add(Restrictions.le("data_Inicial", dataFinal))
.add(Restrictions.ge("data_Final", dataInicial))
.add(Restrictions.le("data_Final", dataFinal))
.add(Restrictions.ge("data_Inicial", dataInicial))
.list();
OBS: Cria um caso de teste maior e com intervalos de datas mais bem distribuídos e faz um teste.