gpt4 book ai didi

java - 如何使用 Spring Data JPA 查询 map 值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:58:42 25 4
gpt4 key购买 nike

所以我的数据库模型是这样的:我有 Store s 和每个 Store有一个本地化名称。所以我选择将本地化名称表示为 Map像这样:

public class Store {
private Map<Locale,LocalizedValue> name;
}

如您所见,它是 <Locale, LocalizedValue> 的 map 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”的商店?

最佳答案

这需要一个像这样的手动定义的查询:

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);
}

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

关于java - 如何使用 Spring Data JPA 查询 map 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26245351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com