我需要通过枚举类型从数据库中获取数据。 我有以下枚举:
public enum ShopType {
VANS("VANS"), ATTICUS("ATTICUS"), FAMOUS("FAMOUS")
ShopType(String label) {
this.label = label;
}
private String label;
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}
在我的DAO类中,我有一个方法,它在jsp
页面上按所选类型返回对象列表。在jsp
页面上,我发送选定的值,如String
,是不是?
看起来我的方法
@Transactional
public List<Shop> findByType(String type) {
return sessionFactory.getCurrentSession().createQuery("from Shop where type=" + ..... .list();
}
我不知道如何创建正确的查询。 Enum i存储在我的数据库中,如tinyint。
这是一个模型。
@Column(name = "type")
@Enumerated(EnumType.ORDINAL)
private ShopType type;
答案 0 :(得分:6)
当你将enum设置为序数时,那么在查询中你应该使用序数。实施例;
@Transactional
public List<Shop> findByType(String type) {
return sessionFactory.getCurrentSession().createQuery("from Shop where type=" + ShopType.valueOf(type).ordinal()).list();
}
如果您更改@Enumerated(EnumType.STRING)
,那么您的查询将如下;
@Transactional
public List<Shop> findByType(String type) {
return sessionFactory.getCurrentSession().createQuery("from Shop where type=" + ShopType.valueOf(type).name()).list();
}
ShopType.valueOf(type)
,仅当字符串类型与枚举名称相同时才会起作用。
此外,如果您的标签与枚举名称相同,那么您不需要标签。
ShopType.VANS.name()
等于"VANS"
且name()
方法是最终的,您可以确定无法覆盖。
答案 1 :(得分:4)
只需将String转换为Enum并使用命名查询参数
@Transactional
public List<Shop> findByType(String type) {
ShopType enumType = shopTypeFromString(type);
return sessionFactory.getCurrentSession().createQuery("from Shop where type=:p_type")
.setParameter("p_type", enumType).list();
}
private ShopType shopTypeFromString(String type) {
// You can implement this convertion in your own way
return ShopType.valueOf(type);
}
答案 2 :(得分:2)
查询中的问题是您连接了绑定参数值,该值除了引起问题外,还可能使您的应用程序暴露于SQL injection attacks。
如果您使用绑定参数值编写查询:
Post post = entityManager.createQuery(
"select p " +
"from Post p " +
"where p.status = :status", Post.class)
.setParameter("status", PostStatus.PENDING)
.getSingleResult();
assertEquals("High-Performance Java Persistence", post.getTitle());
Hibernate将在SQL查询中正确使用ORDINAL值:
Query:["
select
p.id as id1_0_,
p.status as status2_0_,
p.title as title3_0_
from
post p
where
p.status=?
"],
Params:[
0
]
作为一个可行的示例,请查看我的EnumOrdinalTest
中的high-performance-java-persistence
GitHub repository。