我有一个ItemEntity类,该类具有ImageEntity的集合。我希望能够获取特定的ImageEntity,因为它在集合中具有索引。例如,对于具有10个ImageEntity的ItemEntity,我希望第4个ImageEntity出现在尽可能少的数据库匹配中。
我已经阅读了《 Hibernate In Action》并在Google上进行了搜索,但是我能找到的每篇文档在描述@IndexColumn时都非常简洁,没有关于如何使用它的详细示例。
我可以使用item.getImages()来获取List ,然后在其上调用.get(4)。但是,这涉及将整个集合加载到内存中以便能够在其上调用get()。
我想做的是这样的:
int itemId = 111; //我要为其获取图像的商品的ID
int wantImageNum = 4; //我想要的图片的索引,在商品列表中
imageId = ..以某种方式获取第四个ImageEntity的ID。
ImageEntity img = session.load(ImageEntity.class,imageId);
我已经使用@IndexColumn让Hibernate管理集合中ImageEntity的顺序,即:
公共类ItemEntity {
...
@ManyToMany(cascade = {CascadeType.MERGE,
CascadeType.PERSIST,
CascadeType.REFRESH},fetch = FetchType.LAZY)
@JoinTable(name =“ ItemImages”,
joinColumns = {
@JoinColumn(name =“ item_id”,referencedColumnName =“ id”)//此类中的ID
},
inverseJoinColumns = {
@JoinColumn(name =“ image_id”)// ImageEntity中的ID
}
)
@ org.hibernate.annotations.IndexColumn(name =“ idx”,base = 1)
私有列表图像= new ArrayList();
因此,有一个“联接表”如下所示:
表ItemImages(
item_id
image_id
IDX
)
我可以使用普通的SQL做一些非常肮脏的事情,即
从ItemImages中选择image_id,其中item_id =:itemId和idx =:wantImageNum;
这显然是可怕的。我不能使用HQL或Criteria查询来获得类似的技巧,因为ItemImages不是映射的实体,它是由Hibernate管理的联接表。
最佳答案
index()
HQL函数是您要寻找的:
select image
from ItemEntity item
join item.images image
where index(image) = 4
and item.id = 111
在JPA 2.0中,它也已标准化为
INDEX
。从规格:4.6.17.2.2算术函数
functions_returning_numerics::=
ABS(simple_arithmetic_expression) |
SQRT(simple_arithmetic_expression) |
MOD(simple_arithmetic_expression, simple_arithmetic_expression) |
SIZE(collection_valued_path_expression) |
INDEX(identification_variable)
(...)
INDEX
函数返回一个对应于的整数值
其参数在有序位置
清单。 INDEX函数只能是
适用于识别变量
表示订单的类型
已指定列。
在以下示例中,
studentWaitlist
是以下列表有订单列的学生
被指定:
SELECT w.name
FROM Course c JOIN c.studentWaitlist w
WHERE c.name = ‘Calculus’
AND INDEX(w) = 0
参考文献
Hibernate Core参考指南
14.10. Expressions
JPA 2.0规范
4.6.17.2.2节算术函数