我有一张桌子
许可:
我现在正在做的是创建一个返回权限对象的查询,然后以编程方式将值放在地图中
1-但我想知道是否可以创建一个HQL(或者如果不可能的本机sql)来选择permission_id,permission_name并在地图中返回它们.
2-是否可以以一对多的关系返回地图而不是跟随列表或集合
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "perm_cat_map", joinColumns = { @JoinColumn(name = "perm_cat_id") }, inverseJoinColumns = { @JoinColumn(name = "permission_id") })
private List<Permission> permissions = new ArrayList<Permission>(0);
Run Code Online (Sandbox Code Playgroud)
有可能有类似的东西:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "perm_cat_map", joinColumns = { @JoinColumn(name = "perm_cat_id") }, inverseJoinColumns = { @JoinColumn(name = "permission_id") })
private Map<String,String> permissions = new ArrayList<String,String>(0);
Run Code Online (Sandbox Code Playgroud)
其中两个字符串是permission_id,permission_name.
我们目前基于命名查询返回的两个字段手动构建映射,因为JPA仅提供getResultList().
@NamedQuery{name="myQuery",query="select c.name, c.number from Client c"}
HashMap<Long,String> myMap = new HashMap<Long,String>();
for(Client c: em.createNamedQuery("myQuery").getResultList() ){
myMap.put(c.getNumber, c.getName);
}
Run Code Online (Sandbox Code Playgroud)
但是我觉得自定义映射器或者类似物会更高效,因为这个列表很容易就会产生30,000多个结果.
任何想法,无需手动迭代即可构建Map.
(我使用的是OpenJPA,而不是休眠)
所以我的数据库模型是这样的:我有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 …Run Code Online (Sandbox Code Playgroud)