У меня есть класс ItemEntity, который имеет коллекцию ImageEntity.Я хочу иметь возможность извлекать определенный ImageEntity, учитывая его индекс в коллекции.Например, для ItemEntity с 10 ImageEntity я хочу, чтобы 4-е ImageEntity было как можно меньшим количеством обращений к базе данных.
Я прочитал Hibernate In Action и гуглил, но каждая часть документации, которую я могу найти, очень краткаяв описании @IndexColumn, без подробных примеров того, как его использовать.
Я могу использовать item.getImages () для получения List , а затем вызвать .get (4) для этого .. ноэто включает загрузку всей коллекции в память, чтобы иметь возможность вызывать get () для нее.
Я хотел бы сделать что-то вроде:
int itemId = 111; // id of the item I want to fetch the image for
int wantImageNum = 4; // index of the image I want, in the item's list
imageId = .. somehow get the id of the 4th ImageEntity ..;
ImageEntity img = session.load(ImageEntity.class, imageId);
Я использовал @IndexColumnчтобы позволить Hibernate управлять упорядочением ImageEntity в коллекции, например:
public class ItemEntity {
...
@ManyToMany(cascade={CascadeType.MERGE,
CascadeType.PERSIST,
CascadeType.REFRESH}, fetch=FetchType.LAZY)
@JoinTable(name = "ItemImages",
joinColumns = {
@JoinColumn(name="item_id", referencedColumnName="id") // id in this class
},
inverseJoinColumns = {
@JoinColumn(name="image_id") // id in ImageEntity
}
)
@org.hibernate.annotations.IndexColumn(name="idx", base=1)
private List images = new ArrayList();
Таким образом, существует «таблица соединений», которая выглядит следующим образом:
table ItemImages (
item_id
image_id
idx
)
Я мог бы сделать что-тоочень грязный с простым SQL, то есть
select image_id from ItemImages where item_id = :itemId and idx = :wantImageNum;
Это явно ужасно.Я не могу воспользоваться подобным приемом, используя запросы HQL или Criteria, поскольку ItemImages не является сопоставленной сущностью, а таблицей соединений, управляемой Hibernate.