gpt4 book ai didi

java - 如何在 Hibernate 中对同一张表进行子查询?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:56:19 25 4
gpt4 key购买 nike

我有一个名为 item_association 的 Oracle 表和一个伴随的 Hibernate 实体。这是该表中行的示例:

id   group_id  item_id  type   value
====================================
1 1 1234 'lang' 'en'
2 1 2345 'lang' 'fr'

我想查询该表以检索与特定 item_id 共享 group_id 的所有 ItemAssociations,并排除该 item_id 本身。 SQL 将是:

select group_id, item_id, type, value
from ITEM_ASSOCIATION
where group_id in (select group_id from ITEM_ASSOCIATION where item_id = :itemId)
and item_id <> :itemId

我正在尝试使用以下 Hibernate 标准来完成此操作,但我得到:org.hibernate.MappingException: Unknown entity: null

DetachedCriteria subquery = DetachedCriteria.forClass(ItemAssociation.class)
.add(Restrictions.eq("itemId", itemId))
.setProjection(Projections.property("groupId"));

Criteria query = session.createCriteria(ItemAssociation.class)
.add(Property.forName("itemId").in(subquery))
.add(Restrictions.not(Restrictions.eq("itemId", itemId)));

项目关联.java:

@Entity
@Table(name = "ITEM_ASSOCIATION")
public class ItemAssociation {
@Id
@GeneratedValue
private Long id;

@Column(name = "group_id")
private Long groupId;

@OneToOne
@JoinColumn(name = "item_id", insertable = false, updatable = false)
private Item item;

@Column
private String type;

@Column
private String value;

public Long getGroupId() {
return groupId;
}

public void setGroupId(Long groupId) {
this.groupId = groupId;
}

public Item getItem() {
return item;
}

public void setItemId(Item item) {
this.item = item;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}
}

最佳答案

这只是我的疏忽。由于 ItemAassociation 实体包含一个 Item 引用而不是 itemId 字段,我需要将 itemId 更改为 item.id 在我的查询中。此外,query 中的第一个 itemId 应该是 groupId:

DetachedCriteria subquery = DetachedCriteria.forClass(ItemAssociation.class)
.add(Restrictions.eq("item.id", itemId))
.setProjection(Projections.property("groupId"));

Criteria query = session.createCriteria(ItemAssociation.class)
.add(Property.forName("groupId").in(subquery))
.add(Restrictions.not(Restrictions.eq("item.id", itemId)));

关于java - 如何在 Hibernate 中对同一张表进行子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34318464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com