gpt4 book ai didi

java - Hibernate 标准一对多问题

转载 作者:行者123 更新时间:2023-12-01 08:59:51 25 4
gpt4 key购买 nike

我正在尝试使用 Hibernate Criteria api 仅获取基于 USER_ID 的主题,但不知道如何使用该条件来执行此操作。

我的表是“topic_users”(如下)

enter image description here

和“主题”表(如下)

enter image description here

我知道如何使用 SQL 来完成此操作,如下所示:

SELECT TOPICNAME 
FROM topic_users INNER JOIN topics on topic_users.TOPICS_TOPICS_ID = topics.TOPICS_ID
WHERE topic_users.USER_ID = 1

这将返回 USER_ID 1 的所有 TOPICNAME,这正是我想要的,但我如何使用 Hibernate Criteria 来做到这一点。到目前为止,我的 Repository 类中有这个(见下文),但这只会返回一个高度嵌套的 JSON 数组。我可以循环访问对象,使用 DTO 并构建我的响应,或者尝试 Hibernate createSQLQuery 方法,该方法将让我直接调用 native SQL 语句(尚未尝试过)...但是我我正在努力学习标准,所以我希望任何人都可以回答我的问题。

@Repository("userTopicsDao")
public class UserTopicsDaoImpl extends AbstractDao<Integer, UserTopics>implements UserTopicsDao {

@Override
public List<UserTopics> findMyTopics(int userId) {
Criteria crit = createEntityCriteria();
crit.add(Restrictions.eq("userId", userId));
List<UserTopics> userTopicsList = (List<UserTopics>)crit.list();
return userTopicsList;
}

以及我已映射TOPICSTOPIC_USERS实体

@Entity
@Table(name="TOPIC_USERS")
public class UserTopics {

@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="TOPICUSER_ID")
private Integer id;

@Column(name="USER_ID")
private Integer userId;

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "TOPICS_ID")
private Set<Topics> topicsUser;

//getter and setters

最佳答案

好吧,从头开始......你的实体类应该看起来像这样:

@Entity
@Table(name="TOPIC_USERS")
public class UserTopics {

@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="TOPICUSER_ID")
private Integer id;

@Column(name="USER_ID")
private Integer userId;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TOPICS_TOPICS_ID")
private Topics topics;

您的 Topics 类应如下所示:

@Entity
@Table(name="TOPICS")
public class Topic {

@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="TOPICUS_ID")
private Integer id;

@Column(name="TOPICNAME")
private Integer topicName;

@OneToMany(mappedBy = "topics")
private Set<UserTopics> userTopics;

最后的标准:

版本 1) 您将获得整个实体:

Criteria c = session.createCriteria(Topics.class, "topics");
c.createAlias("topics.userTopics", "userTopics");
c.add(Restrictions.eq("userTopics.userId", userId));
return c.list(); // here you return List<Topics>

版本 2) 您仅投影主题名称:

Criteria c = session.createCriteria(Topics.class, "topics");
c.createAlias("topics.userTopics", "userTopics");
c.add(Restrictions.eq("userTopics.userId", userId));
c.setProjection(Projections.property("topics.topicName"));
List<Object[]> results = (List<Object[]>)c.list();

// Here you have to manually get the topicname from Object[] table.

}

关于java - Hibernate 标准一对多问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41772043/

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