Une bonne pratique est de déclarer la procédure nommée sur l'objet Hibernate qui est directement concerné. La raison est simplement de pouvoir retrouver rapidement cette requête le jour où on la cherche. La manière de la déclaré est la suivante.

@Entity
..
@NamedQueries({ @NamedQuery(
name = HObject.QUERY_FIND_NAME, 
query = "select distinct champ1 from table1 t order by champs2") })
public class HObject {
    public static final String QUERY_FIND_NAME = "nameproc1";
..
}

Ensuite on l'utilise sur le DAO, en imaginant que l'on appelle le DAO de cette manière.

this.dao.findByNamedQuery(HObject.QUERY_FIND_NAME);

Et que la définition du DAO ressemble à quelque chose comme ça.

  public  List findByNamedQuery(final String pName, final String... pValues) {

    final Query vQuery = this.getSession().getNamedQuery(pName);
    int vCpt = 0;
    for (final String vParam : pValues) {
      vQuery.setString(vCpt++, vParam);
    }
    return vQuery.list();
  }

La définition du DAO gère les paramètres au cas où la requête en ai besoin. Dans notre exemple cette gestion n'a pas d'importance, mais elle permet de mieux illustrer la notion de DAO.