Прежде всего, спасибо всем, кто пытается помочь.
Я разрабатываю простой игровой бэкэнд с MYSQL DB и hibernate ORM и пытаюсь выборочно загрузить отношение.
Вот как сущности определяются в Java, были включены только соответствующие поля:
@Entity
@Table(name = "CHARACTERS", uniqueConstraints = { @UniqueConstraint(columnNames = { "CHARACTER_UID" }) })
public class Character {
@OneToMany(mappedBy = "character", targetEntity = CharacterItem.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<CharacterItem> characterItems = new ArrayList<>();
@Column(name = "IS_ACTIVE", nullable = false, columnDefinition = "TINYINT(1)")
@Type(type = "org.hibernate.type.NumericBooleanType")
private boolean isActive;
}
@Entity
@Table(name = "CHARACTER_ITEMS", uniqueConstraints = { @UniqueConstraint(columnNames = { "ITEM_UID" }) })
public class CharacterItem {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CHARACTER_UID")
private Character character;
@Column(name = "ITEM_STATUS", length = 1)
private String itemStatus;
}
Таблица определений:
CREATE TABLE IF NOT EXISTS CHARACTERS
(IS_ACTIVE BOOLEAN NOT NULL DEFAULT FALSE);
CREATE TABLE IF NOT EXISTS CHARACTER_ITEMS
(CHARACTER_UID VARCHAR(80) NOT NULL,
ITEM_STATUS VARCHAR(1),
FOREIGN KEY (CHARACTER_UID) REFERENCES CHARACTERS(CHARACTER_UID));
У меня есть следующий метод класса DAO:
@Override
public List<Character> getActiveCharacters() {
List<Character> res = em
.createQuery("SELECT c FROM Character c JOIN c.characterItems ci WHERE c.isActive = 1 and ci.itemStatus = 'A'", Character.class)
.getResultList();
return res;
}
То, что я хочу, это вернуть список активных объектов символов, чьи характеры символов активно инициализируются, и я хочу, чтобы эти элементы символов были только активными элементами (itemStatus = 'A'), однако я получаю список с дублированием символов записи, и как только я вызываю Character.getCharacterItems (), генерируется еще один sql и все элементы загружаются независимо от их статуса (отложенная загрузка).
Есть ли способ сделать это с помощью JPA?
Я хочу, чтобы это было выполнено в одном запросе из-за соображений производительности, поскольку ожидается, что многие символьные элементы будут иметь значение состояния элемента, отличное от 'A'.
Я также пробовал объединить выборки, но в соответствии со спецификацией JPA это не может быть псевдонимом, следовательно, фильтрация извлечения не может быть выполнена, если я что-то упустил.