所以我的數據庫模型是這樣的:我有Store
s和每個Store
都有一個本地化的名稱。所以,我選擇了代表的本地化名稱作爲Map
這樣的:如何使用Spring Data JPA查詢Map值?
public class Store {
private Map<Locale,LocalizedValue> name;
}
,你可以看到這是一個地圖的<Locale, LocalizedValue>
其中LocalizedValue
是這樣一類:
@Embeddable
public class LocalizedValue {
@Column(name = "value")
private String value;
}
而這一切效果很好。但是,我遇到了一個問題,我想查詢我的Spring Data JPA存儲庫並查找具有給定英文名稱的所有商店。所以,我的倉庫方法是這樣的:
Store findByName(Map.Entry<Locale, LocalizedValue> name);
但引發此異常:
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)
於是我改變了我的資料庫的方法是這樣的:
Store findByName(LocalizedValue name);
後來我得到這個例外:
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)
我也嘗試在查詢方法中使用Contains - 仍然沒有運氣。
所以我的問題是:有沒有辦法查詢英文名稱爲「Some Value」的商店?
感謝您的回答。這是在Spring JPA中記錄的嗎?我在哪裏可以獲得更多關於Spring JPA如何擴展地圖值的信息。 – Sharadr 2017-02-27 09:05:22
同樣可以用Collection參數來完成嗎? – mihn 2017-05-22 12:49:45