SpEL czyli Spring Expression Language
SpEL czyli Spring Expression Language
Spring Expression Language jest językiem wyrażeń który upraszcza dostęp do obiektów czy parsowanie danych np. w ramach zapytań. Rozważmy przykład użycia SpEL na przykładzie adnotacji Query. Dla uproszczenia artykułu nie będę tutaj przedstawiał konfiguracji bazy danych. Utwórzmy prostą encję:
@Entity(name = "employee") public class Employee { @Id @GeneratedValue private Long id; private String name; private String surname; private int salary; public Employee() { } public Employee(String name, String surname, int salary) { this.name = name; this.surname = surname; this.salary = salary; } @Override public String toString() { return "Employee{" + "name='" + name + '\'' + ", surname='" + surname + '\'' + ", salary=" + salary + '}'; } }
Przykładowe repozytorium z wyrażeniem SpEL:
@Repository public interface EmployeeRepository extends CrudRepository<Employee, Long> { @Query("SELECT e FROM #{#entityName} e WHERE e.name = ?1") List<Employee> findByName(String name); }
Klasa startowa:
@SpringBootApplication public class SpElApplication implements CommandLineRunner { @Autowired EmployeeRepository employeeRepository; @Override public void run(String... args) throws Exception { employeeRepository.save(new Employee("Tom", "Spring", 2000)); employeeRepository.save(new Employee("Davids", "Spring", 3000)); Iterable<Employee> all = employeeRepository.findAll(); all.forEach(System.out::println); } public static void main(String[] args) { SpringApplication.run(SpElApplication.class, args); } }
używając wyrażenia SpEL:
#{#entityName}
nie definiujemy na sztywno nazwy encji z której pobierane są dane. Jest ona rozwiązywana dynamicznie na podstawie:
@Entity(name = "employee")
w wyniku wykonania metody findAll otrzymamy:
Employee{name='Tom', surname='Spring', salary=2000} Employee{name='Davids', surname='Spring', salary=3000}
załóżmy że chcielibyśmy zdefiniować następujące filtry wyszukiwania:
- name,
- surname,
- salary.
wykorzystajmy wyrażenia SpEL i dodajmy nową metodę wyszukiwania do naszego repozytorium:
@Query("SELECT e FROM #{#entityName} e WHERE " + "(:#{#name} is NULL OR e.name =:#{#name}) " + "AND " + "(:#{#surname} is NULL OR e.surname =:#{#surname})" + "AND" + "(:#{#salary} is NULL OR e.salary >:#{#salary})") List<Employee> findEmployeeByCriteria( String name, String surname, int salary );
Test – wyszukajmy pracowników których pensja jest wyższa niż 2000:
Iterable<Employee> allCriteriaEmployee = employeeRepository.findEmployeeByCriteria(null, null, 2000); allCriteriaEmployee.forEach(System.out::println);
w wyniku wykonania metody findEmployeeByCriteria z parametrem pensji 2000 otrzymamy pracowników których pensja jest wyższa niż 2000. W naszym przypadku jest to tylko jeden taki pracownik:
Employee{name='Davids', surname='Spring', salary=3000}
Skorzystajmy teraz z wyrażeń SpEL w kontekście adnotacji Value:
@Component public class EnviromentInfo { @Value("#{systemProperties['java.home']}") public String JAVA_HOME; }
z pomocą wyrażeń SpEL udało się z powodzeniem odczytać wartość parametru zmiennje środowiskowej JAVA_HOME:
System.out.println(enviromentInfo.JAVA_HOME);
Leave a comment