我有一个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节算术函数

07-24 09:28