4 Jahre nach dem ersten Posten gibt es einige Entwicklungen. Mit Spring 4 und Hibernate 4 ist es jetzt möglich, Hibernate mit einem SpEL-Ausdruck zu "tricksen". Zum Beispiel:
Die Aufzählung:
package com.mycompany.enums
public enum Status {
INITIAL, PENDING, REJECTED, APPROVED, SHIPPED, DELIVERED, COMPLETE;
}
Hier ist eine Wrapper-Klasse namens 'Filter', die wir an die Repository-Filtermethode übergeben.
package com.mycompany.enums
public class Filter implements Serializable {
private Integer id;
private Status status;
public String getStatusName() {
return null == status ? status : status.name();
}
}
Schließlich können wir im Repository jetzt die Filter-Klasse als einzelnen Parameter verwenden und die Abfrage veranlassen, eine Mischung aus Literalen und SpEL-Ausdrücken in ein Status-Objekt zu übersetzen:
Das Repository:
package com.mycompany.repository
@Repository
public interface OrderRepository extends CrudRepository<Order, Integer> {
@Query("SELECT o from Order o "
+ "WHERE o.id = COALESCE(:#{#filter.id},o.id) "
+ "AND o.status = COALESCE(:#{T(com.mycompany.enums.Status).#filter.statusName},o.status)")
public List<Order> getFilteredOrders(@Param(value = "filter") Filter filter);
}
Dies funktioniert einwandfrei, aber aus irgendeinem Grund habe ich es noch nicht herausgefunden. Wenn Sie das SQL-Debugging im Ruhezustand aktivieren und die Ordnerprotokollierung aktivieren, können Sie nicht sehen, dass der Ruhezustand diesen Ausdruck an Abfragevariablen bindet.