Dê uma olhada no link que o jake falou lá no blog dele, é excelente, mas indo direto ao ponto, sempre que você especificar, em uma query, que você quer valores entre (BETWEEN) um determinado range, você terá que passar estes valores na linguagem do sql e na formatação também.
Seu código:
q = motor.createQuery("select c from Contato c where c.dat between " + data_search_ini + " and " + data_search_ini2);
Rende isto:
select c from Contato c where c.dat between 02/09/2012 and 02/09/2012
Enquanto o que deveria ser feito seria isto:
select c from Contato c where c.dat between '2012-09-02' and '2012-09-02'
entre ’ simples e no formato yyyy-MM-dd.
Contornando a situação com o teu próprio código:
q = motor.createQuery("select c from Contato c where c.dat between str_to_date('" + data_search_ini + "','%d/%m/%Y') and str_to_date('" + data_search_ini2 "','%d/%m/%Y'));
o que vai acontecer, o valor que é passado no nosso padrão, dd/MM/yyyy que está indo como uma String, será transformado em uma data válida, assim realizará a sua query.