2016-08-19 4 views
0

Я использую namedquery для rest api, используя Spring JPA. Именованный запрос реализуется в моем классе сущностей:IllegalArgumentException: NamedQuery с использованием Spring JPA

@Entity 
@Table(name="SPECIMEN_TB") 
@NamedQueries({ 
    @NamedQuery(name="SpecimenTb.findBySpecimenNo", query="select s from SpecimenTb s where s.specimenNo = :specimenNo"), 
}) 

public class SpecimenTb implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SPECIMEN_TB_ROWID_GENERATOR") 
    @Column(name="ROW_ID") 
    private long rowId; 

    @Column(name="SPECIMEN_NO", unique = true) 
    private String specimenNo; 

Мой контроллер выглядит следующим образом:

@RestController 
public class RistoreController { 
    @Autowired 
    private RistoreService ristoreService; 

    @RequestMapping(
      value = "/ristore/foundation/{specno}", 
      method = RequestMethod.GET, 
      produces = "application/json") 
    public ResponseEntity<SpecimenTb> getFmSpecimen(@PathVariable("specno") String specno) { 
     List<SpecimenTb> specimens = ristoreService.findBySpecimenNo(specno); 
     if (specimens == null) { 
      return new ResponseEntity<SpecimenTb>(HttpStatus.NOT_FOUND); 
     } 
     return new ResponseEntity<SpecimenTb>(specimens.get(0), HttpStatus.OK); 
    } 

У меня есть сервис боб, который вызывает JPA хранилище findBySpecimenNo метод.

@Service 
public class RistoreServiceBean implements RistoreService { 

    @Autowired 
    private SpecimenRepository specimenRepository; 

    @Override 
    public List<SpecimenTb> findAll() { 
     List<SpecimenTb> specimens = specimenRepository.findAll(); 
     return specimens; 
    } 

    @Override 
    public List<SpecimenTb> findBySpecimenNo(String specimenNo) { 
     List<SpecimenTb> specimens = specimenRepository.findBySpecimenNo(specimenNo); 
     return specimens; 
    } 

Когда я начинаю пружинные загрузки приложений и введите URL-адрес «http://localhost:8080/ristore/foundation/SKM1», я получил следующее сообщение об ошибке:

java.lang.IllegalArgumentException: Parameter with that position [1] did not exist 

Что я сделал не так?

ответ

2

Похоже, вы не можете использовать именованный параметр с @NamedQuery на основе документов, которые я читаю. Вы пробовали с ?1 вместо этого?

Причина, по которой именованный параметр не работает, заключается в том, что вы также должны добавить аннотацию к параметру метода, чтобы Spring знала, какой параметр соответствует тому, что заполнитель в запросе.

+0

он работает сейчас, где именно «добавить аннотацию к параметру метода», если я хочу заставить именованный параметр работать? – ddd

+0

Я не вижу ваш интерфейс/класс репозитория, но это то, где это будет сделано. Ознакомьтесь с документами spring-data-jpa вокруг '@ Query' –

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