anchor.diff:  
   == Un editor de consultas JPA en nuestro IDE
   
  -A continuación vamos a configurar una utilidad de las muchas que trae el paquete JBoss Tools que nos va a facilitar las cosas cuando necesitemos ampliar la capa de negocio con nuevas consultas, basadas en HQL/JPQL o construidas con el API Criteria. Se trata de las Hibernate Tools. Una vez configurada ejecutaremos una consulta JPQL directamente en Eclipse.
  -
  -Para que el mapeo ORM sea efectivo en las Hibernate Tools las clases deben aparecer de forma explícita en el archivo persistence.xml de definición de la unidad de persistencia. Así que borramos la línea
  -
  -`<exclude-unlisted-classes>false</exclude-unlisted-classes>`
  -
  -y dejamos el contenido del fichero así:
  +A continuación vamos a configurar una utilidad, de las muchas que trae el paquete JBoss Tools, que nos va a facilitar bastante las cosas cuando necesitemos incluir nuevas consultas en la capa de negocio, usando HQL/JPQL o el API Criteria. Se trata de las Hibernate Tools.
  +
  +Para que en nuestra aplicación el mapeo de entidades que hace Hibernate Tools sea correcto éstas deben aparecer de forma explícita en el archivo persistence.xml de definición de la unidad de persistencia. Así que abrimos el fichero y eliminamos la línea `<exclude-unlisted-classes>false</exclude-unlisted-classes>` sustituyendo, con un copia pega, el contenido del fichero por el siguiente:
   
   [source,xml,indent=0]
   ----
  
positive.code: order by d.numeroDeSerie
  ----
  
  En la primera línea se filtran los atributos o entidades que la consulta devuelve. Al indicar el alias _d_ en _select d_ estamos diciendo que queremos que la consulta sólo devuelva objetos Drone. En Hibernate es posible prescindir de esta parte de la consulta. Si lo hacemos no habrá filtrado de datos y la consulta devolverá todas los objetos que intervienen en la misma, definidos en la parte _from_. Es decir que devolvería una lista de array de objetos `List<Object[]>` donde el primer elemento del array es un objeto Drone y el segundo un objeto Trabajo.
  
  En la segunda línea como se ha comentado se determinan las entidades que intervienen en la consulta. En este caso el conjunto de datos consiste en un inner join entre Drone y Trabajo. El join se hace indicando el campo de la entidad padre que da acceso a las entidades hijas relacionadas _d.trabajosAsignados_.
  
  La tercera línea hace el filtrado de los registros, de manera similar a lo que existe en el SQL de toda la vida. Podemos ver cómo se ha definido el parámetro nombrado _:fecha_ para inyectar el valor dentro de la consulta.
  
  Por último definimos un orden para el conjunto de elementos devueltos. En nuestro caso como lo que devolvemos son "disponibilidades de drones" tiene sentido que el orden lo definamos sobre el campo que identifica al drone, de modo que el usuario lo pueda localizar con facilidad.
  
  Las definiciones de las consultas de una aplicación podemos agruparlas, en general la clase Entity relacionada, de manera que podemos reutilizar la misma consulta en varios puntos y mantener de forma más eficiente la aplicación. Para esto tenemos que convertir nuestra consulta en una NamedQuery. Vamos a ello. En primer lugar abrimos la clase Drone y añadimos la siguiente anotación justo debajo de la anotación _@Entity_:
  
  [source,java,indent=0]
  ----
  
negative.code: }) 
  ----
  
  Como de costumbre usamos la hotkey Crtl + O para traernos las nuevas importaciones. Y añadimos a la clase de negocio el método siguiente, que es equivalente al _obtenEstadoDronesPorFecha_ pero usando una NamedQuery:
  
  [source,java,indent=0]
  ----
  