JPA: выборочное извлечение связанных объектов - PullRequest
0 голосов
/ 10 июля 2019

Прежде всего, спасибо всем, кто пытается помочь.

Я разрабатываю простой игровой бэкэнд с 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 это не может быть псевдонимом, следовательно, фильтрация извлечения не может быть выполнена, если я что-то упустил.

...