JPA:相关实体的选择性获取

时间:2019-07-10 18:58:10

标签: java hibernate jpa orm jpql

首先,感谢任何尝试提供帮助的人。

我正在使用MYSQL DB和休眠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;
}

我想要的是返回一个活跃的Character对象的列表,这些对象的characterItems已被初始化,并且我希望那些字符项目仅是active项(itemStatus ='A'),但是,我得到的是重复的Character列表记录,并且一旦我调用Character.getCharacterItems(),就会生成另一个sql,无论状态如何,所有项目都将被加载(延迟加载)。

是否可以使用JPA来完成此任务? 由于性能原因,我希望在一个查询中执行此操作,因为许多characterItem的项目状态值都不是'A'。

我也尝试了联接提取,但是根据JPA规范,这不能被别名,因此除非已丢失某些内容,否则无法对提取的关系进行过滤。

0 个答案:

没有答案