2014-12-11 3 views
0

Это мой класс сущности.Spring Framework: findBy throws Недопустимый аргумент

@Entity 
public class Profile { 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long profileId; 

@Transient 
private String name; 

@ElementCollection(fetch = FetchType.EAGER) 
private Map<String, String> trNames;  //Key: LanguageCode, Value: translated text 
... 
} 

ProfileRepository Класс

public interface ProfileRepository extends JpaRepository<Profile, Long> { 

//This method should go through the Map Collection and return a profile whose name matches the given parameter value. 
Profile findByTrNames(String code, String name); 

} 

Я создал тестовый класс JUnit, чтобы проверить этот метод. Эта строка кода

Profile found = repository.findByTrNames("en", "Interview IT"); 

бросает исключение.

org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [en] did not match expected type [java.util.Map]; nested exception is java.lang.IllegalArgumentException: Parameter value [en] did not match expected type [java.util.Map] 
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:301) 
    at etc.. 

Может ли кто-нибудь мне помочь?

спасибо.

ответ

2

Это должно работать

@Query("select p from Profile p where p.trNames[?1] = ?2") 
Profile findByTrNames(String code, String name); 

UPDATE

JIRA билет создан для поддержки этой функции: https://jira.spring.io/browse/DATAJPA-643

+0

большой .. Это делает действительно. :) Не могли бы вы, возможно, объяснить, почему это заставило исключение? Почему он ожидал тип java.util.Map? –

+1

'spring-data' строит запрос на основе вашего объявленного имени метода, которое является' findByTrNames'. Так как 'trNames' имеет тип' Map', он ожидает, что параметр будет также 'Map'. Я согласен, что это может быть немного умнее, когда дело доходит до полей «Карта» в сущности, поскольку они несколько специфичны, и имеет смысл, что два параметра в методе могут быть интерпретированы как ключ и значение. –

+0

Да, я понимаю это сейчас. Огромное спасибо. :) –

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