首先,感谢任何尝试提供帮助的人。
我正在使用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规范,这不能被别名,因此除非已丢失某些内容,否则无法对提取的关系进行过滤。