It would help to know exactly what repeated queries that you're seeing. As others pointed out, we're just speculating without seeing your mappings. You might be running into Hibernate's eager fetching. This is where Hibernate tries to load an entire object graph for every User (and their Addresses, Phones, Pets, etc.) matching the very general name contains 'tom' query. Try turning off default eager fetching for User properties in your Hibernate mapping files or annotations and then do the following:
Let's say you're getting lots of repeated queries looking into the tables USER_ADDRESS (hibernate property "addresses"), USER_PHONE (property "phones"), and USER_PET (property "pets"). Use the following criteria calls to join these attributes in the original query and reduce repeated queries. Hibernate knows how to break these columns apart into separate objects. You can also try adding a maximum number of returned results.
Criteria myUsers = getCurrentSession().createCriteria(User.class);
myUsers = myUsers.add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE));
myUsers.createCriteria("addresses"); // NEW
myUsers.createCriteria("phones"); // NEW
myUsers.createCriteria("pets"); // NEW
myUsers.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
myUsers.setMaxResults(100); // NEW
result.addAll(myUsers.list());
You can learn more in sections 15.4-15.6 here:
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html#querycriteria-associations