Forma correta implementar DAO

Bom dia a todos,

Gostaria de uma sugestão para implementar corretamente a camada DAO.
Minha maior dúvida é a seguinte, existe alguma forma de se criar um método de listagem/busca mais genérico, que atenda varios tipos de buscas??
Por exemplo?

public List<?> listByName(String name) throws DAOException;
public List<?> listById(Integer id) throws DAOException;
public List<?> listByCpf(String cpf) throws DAOException;

Hoje minha interface está da seguinte forma:

public interface GenericDAO<T> {

	public T load(int id) throws DAOException;

	public List<?> listAll() throws DAOException;

	public List<?> listAll(int startPage, int maxPage) throws DAOException;

	public void save(T object) throws DAOException;

	public void update(T object) throws DAOException;

	public void delete(T object) throws DAOException;

	public long count() throws DAOException;

}

Desde já agradeço.

Bom dia caro robinsonbsilva, essa forma irá torna seu método genérico a passagem de parâmetros , ficando a responsabilidade de saber qual campo usar quem vai implementar. public List<?> listPorParametro(Object… object) throws DAOException;

Eu implemento o método list passando querys nomeadas e setando os parâmetros dentro de um loop, é uma forma que considero bem genérica:


public List<T> list(String query, Object... params) {
   ...
      for(...) {
         Query.setParameter(param[i]);
      }
   ...
}