để mô hình cơ sở dữ liệu của tôi giống như thế này: Tôi có Store
s và mỗi Store
đều có tên được bản địa hóa. Vì vậy, tôi đã chọn để đại diện cho tên cục bộ như một Map
như thế này:Cách truy vấn các giá trị Bản đồ với JPA dữ liệu Spring?
public class Store {
private Map<Locale,LocalizedValue> name;
}
như bạn có thể nhìn thấy nó là một bản đồ của <Locale, LocalizedValue>
nơi LocalizedValue
là một lớp học như thế này:
@Embeddable
public class LocalizedValue {
@Column(name = "value")
private String value;
}
và nó tất cả hoạt động tốt. Tuy nhiên tôi nhận được một vấn đề mà tôi muốn truy vấn kho dữ liệu Spring JPA của tôi và tìm tất cả các cửa hàng với một tên tiếng Anh cụ thể. Vì vậy, phương pháp kho của tôi trông như thế này:
Store findByName(Map.Entry<Locale, LocalizedValue> name);
nhưng nó ném ngoại lệ này:
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)
Vì vậy, sau đó tôi đã thay đổi phương pháp kho của tôi là như thế này:
Store findByName(LocalizedValue name);
nhưng sau đó tôi có ngoại lệ này:
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)
Tôi cũng đã thử sử dụng Chứa trong phương thức truy vấn - vẫn không có may mắn.
Vì vậy, câu hỏi của tôi là: Có cách nào để truy vấn các cửa hàng có tên tiếng Anh là 'Một số giá trị' không?
Cảm ơn câu trả lời của bạn. Tài liệu này có được ghi trong Spring JPA không? Tôi có thể tìm thêm thông tin về cách các giá trị bản đồ được mở rộng bởi Spring JPA. – Sharadr
Có thể thực hiện tương tự với thông số Bộ sưu tập không? – mihn