如何使用Spring Data JPA查询Map值?

Pet*_*iev 6 java spring jpa spring-data spring-data-jpa

所以我的数据库模型是这样的:我有Stores,每个Store都有一个本地化的名称.所以我选择将本地化名称表示为Map:

public class Store {
   private Map<Locale,LocalizedValue> name;
}
Run Code Online (Sandbox Code Playgroud)

你可以看到这是一个地图<Locale, LocalizedValue>,其中LocalizedValue是这样一类:

@Embeddable
public class LocalizedValue {

   @Column(name = "value")
   private String value;
}
Run Code Online (Sandbox Code Playgroud)

这一切都很棒.但是我遇到了一个问题,我想查询我的Spring Data JPA存储库并查找具有给定英文名称的所有商店.所以我的存储库方法如下所示:

Store findByName(Map.Entry<Locale, LocalizedValue> name);
Run Code Online (Sandbox Code Playgroud)

但它抛出了这个异常:

 2014-10-07 23:49:55,862 [qtp354231028-165] ERROR: Parameter value [en=Some Value] did not match expected type [com.test.LocalizedValue(n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [en=Some Value] did not match expected type [com.test.LocalizedValue (n/a)]
org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [en=Some Value] did not match expected type [com.test.LocalizedValue (n/a)]; 
nested exception is java.lang.IllegalArgumentException: Parameter value [en=Some Value] did not match expected type [com.test.LocalizedValue (n/a)]
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:384)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:216)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
Run Code Online (Sandbox Code Playgroud)

那么我将我的存储库方法更改为:

Store findByName(LocalizedValue name);
Run Code Online (Sandbox Code Playgroud)

但后来我得到了这个例外:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'name1_.pk' in 'where clause'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
Run Code Online (Sandbox Code Playgroud)

我也尝试在查询方法中使用Contains - 仍然没有运气.

所以我的问题是:有没有办法查询英文名称'Some Value'的商店?

Oli*_*ohm 8

这需要手动定义的查询,如下所示:

interface StoreRepository extends Repository<Store, Long> {

  @Query("select s from Store s join s.map m where ?1 in (VALUE(m))"
  Optional<Store> findByName(String name);
}
Run Code Online (Sandbox Code Playgroud)

它基本上告诉持久性提供程序扩展映射值并检查给定参数是否在扩展值列表中.

  • 感谢您的回答.这是在Spring JPA中记录的吗?我在哪里可以获得有关Spring JPA如何扩展地图值的更多信息. (3认同)