Po 4 latach od pierwszego stanowiska nastąpiły pewne zmiany. Używając spring 4 i Hibernate 4, można teraz „oszukać” Hibernate, używając wyrażenia SpEL. Na przykład:
Wyliczenie:
package com.mycompany.enums
public enum Status {
INITIAL, PENDING, REJECTED, APPROVED, SHIPPED, DELIVERED, COMPLETE;
}
Oto klasa opakowania o nazwie „Filter”, którą przekażemy do metody filtrowania repozytorium.
package com.mycompany.enums
public class Filter implements Serializable {
private Integer id;
private Status status;
public String getStatusName() {
return null == status ? status : status.name();
}
}
Wreszcie w repozytorium możemy teraz użyć klasy Filter jako pojedynczego parametru i sprawić, że zapytanie przetłumaczy coś, co wydaje się być mieszaniną literałów i wyrażeń SpEL na obiekt Status:
Repozytorium:
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);
}
Działa to doskonale, ale z jakiegoś dziwnego powodu, którego jeszcze nie rozgryzłem, jeśli włączysz debugowanie SQL w hibernacji i włączysz rejestrowanie spinacza, nie będziesz w stanie zobaczyć Hibernacji wiążącej to wyrażenie ze zmiennymi zapytania.