2015-04-23 2 views
4

У меня возникли проблемы с получением SPEL и Spring JPA данные для работыВесна данных JPA SPEL - @Query выпуск

Ниже Мой Repository

package eg.repository; 
public interface MyEntityRepository extends JpaRepository<MyEntity, Long>,JpaSpecificationExecutor<MyEntity> { 

    @Query("SELECT e FROM eg.domain.MyEntity e " + 
      "WHERE e.title = :#{#filter.title}" 
    ) 
    Page<MyEntity> list1(@Param("filter") MyFilter filter,Pageable pageable); 
} 

Фильтр Компонент

package eg.service; 

import org.springframework.stereotype.Component; 

@Component("filter") 
public class MyFilter { 

    public String titleFilter() { 
     return "%title%"; 
    } 
    private String title = "title title1"; 
    public Long[] idFilter() { 
     return new Long[] { 
       1L, 2L 
     }; 
    } 
} 

Следующий MyEntity

package eg.domain; 
@Entity 
public class MyEntity implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Column(name = "title") 
    private String title; 
    ...... 
} 

Главный класс

LOG.info("Application initialized " + annotationConfigApplicationContext); 
     MyEntityRepository myEntityRepository = 
        (MyEntityRepository) annotationConfigApplicationContext.getBean(MyEntityRepository.class); 
     MyFilter filter = annotationConfigApplicationContext.getBean(MyFilter.class); 
     PageRequest pageRequest = new PageRequest(0, 5); 
     Page<MyEntity> page = myEntityRepository.list1(filter,pageRequest); 
     List<MyEntity> entities= page.getContent(); 
     for(MyEntity entity: entities){ 
      System.out.println(entity.getId() + " TITLE " + entity.getTitle()); 
     } 

Ниже ошибка, что я получаю

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myEntityRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: Using named parameters for method public abstract org.springframework.data.domain.Page eg.repository.MyEntityRepository.list1(eg.service.MyFilter,org.springframework.data.domain.Pageable) but parameter 'filter' not found in annotated query 'SELECT e FROM eg.domain.MyEntity e WHERE e.title = :#{#filter.title}'! 
+0

Почему вы не просто указываете заголовок как параметр, а не как '@Query (" SELECT e FROM eg.domain.MyEntity e WHERE e.title =: filter ")'? –

+0

Я просто пытаюсь заставить Spel работать с данными весны. Как только это работает, я планирую добавить более сложные вещи, как это можно увидеть в методах idFilter() и т. Д. – ArunM

+0

Я также не могу получить простое выражение # {# variable}. – RedDeckWins

ответ

0
private String title = "title title1"; 

название фильтра является частным, и я не мог видеть любой поглотитель для этого имущество. Может быть, это проблема.

+0

Nopes .. Я устал от геттера и не повезло – ArunM

+0

Вы пробовали другие альтернативы, такие как '? # {Filter.title}' –

0

Доступ к значениям переданных объектов параметров с помощью SpEL в общем работает как шарм, и даже ваш синтаксис кажется правильным.

Может сравнить его снова: Spring Data JPA and SpEL

Вы действительно уверены, что сообщение об ошибке относится к точно Опубликованная код? Вы отрегулировали его позже? Я немного упростил его, и это пример рабочего примера.

лица:

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 

@Entity 
public class MyEntity { 

    @Id 
    @GeneratedValue 
    private Long id; 

    private String title; 

    public MyEntity(String title) { 
     this.title = title; 
    } 

    public Long getId() { 
     return id; 
    } 

    public String getTitle() { 
     return title; 
    } 

} 

Репозиторий:

package com.example.repository; 

import org.springframework.data.domain.Page; 
import org.springframework.data.domain.Pageable; 
import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.data.jpa.repository.Query; 
import org.springframework.data.repository.query.Param; 

import com.example.model.MyEntity; 
import com.example.model.MyFilter; 

public interface MyEntityRepository extends JpaRepository<MyEntity, Long> { 

    @Query("SELECT e FROM MyEntity e WHERE e.title = :#{#filter.title}") 
    Page<MyEntity> list1(@Param("filter") MyFilter filter, Pageable pageable); 

} 

"Фильтр":

package com.example.model; 

public class MyFilter { 

    private String title; 

    public MyFilter(String title) { 
     this.title = title; 
    } 

    public String getTitle() { 
     return title; 
    } 

} 

И соответствующий тест:

package com.example.repository; 

import static org.hamcrest.CoreMatchers.is; 
import static org.hamcrest.MatcherAssert.assertThat; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.test.context.SpringBootTest; 
import org.springframework.data.domain.PageRequest; 
import org.springframework.test.context.junit4.SpringRunner; 
import org.springframework.transaction.annotation.Transactional; 

import com.example.model.MyEntity; 
import com.example.model.MyFilter; 

@RunWith(SpringRunner.class) 
@Transactional 
@SpringBootTest 
public class MyEntityRepositoryTests { 

    @Autowired 
    private MyEntityRepository myEntityRepository; 

    @Test 
    public void insertAndReceiveEntityBySpEL() { 
     final String titleA = "A"; 
     final String titleB = "B"; 

     final MyEntity entityA = new MyEntity(titleA); 
     final MyEntity entityB = new MyEntity(titleB); 
     final MyEntity entityB2 = new MyEntity(titleB); 

     myEntityRepository.save(entityA); 
     myEntityRepository.save(entityB); 
     myEntityRepository.save(entityB2); 

     final MyFilter filterA = new MyFilter(titleA); 
     final MyFilter filterB = new MyFilter(titleB); 

     assertThat("Expected one hit for value A!", myEntityRepository.list1(filterA, new PageRequest(0, 5)).getContent().size(), is(1)); 
     assertThat("Expected two hits for value B!", myEntityRepository.list1(filterB, new PageRequest(0, 5)).getContent().size(), is(2)); 
    } 

} 

Возможно, вы также упростите свой код и узнаете, что именно там происходит. Выражение SpEL не должно быть реальной проблемой.

Некоторые другие вещи также не может быть причиной ошибки, но все же это кажется странным:

  • Какие методы titleFilter() и idFilter() для? Вы не используете его здесь, и он не будет использоваться в запросе.

  • Как установить/отрегулировать значение члена title вашего объекта MyFilter во время выполнения? Является ли это жестко запрограммированным? И, следовательно, нет никакого геттера, как следует использовать JPA и использовать его для сравнения?

  • Почему ваш репозиторий расширяется JpaSpecificationExecutor?

Последнее, что наиболее сбивает с толку. Возможно ли, что вы хотите работать с ? Затем вам понадобится проверка Predicate, чтобы реализовать свой «Фильтр».

Смежные вопросы