Hibernate Criteria One to Many 问题
Hibernate Criteria One to Many issues
我正在尝试使用 Hibernate Criteria api 仅获取基于 USER_ID
的主题,但不知道如何使用该标准进行操作。
我的表是 "topic_users"(下)
和"topics"table(下)
我知道如何使用 SQL,这类似于:
SELECT TOPICNAME
FROM topic_users INNER JOIN topics on topic_users.TOPICS_TOPICS_ID = topics.TOPICS_ID
WHERE topic_users.USER_ID = 1
这将 return USER_ID
1 的所有 TOPICNAME
这正是我想要的,但我如何使用 Hibernate Criteria 来做到这一点。到目前为止,我的存储库 class 中有这个(见下文),但这只会 return 一个高度嵌套的 JSON 数组。我可以遍历对象,使用 DTO 并构建我的响应或尝试 Hibernate createSQLQuery
方法,它可以让我直接调用本机 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;
}
和我的 TOPIC_USERS
实体,我在其中映射了 TOPICS
@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
好的,从头开始..你的实体 classes 应该是这样的:
@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;
您的主题 class 应如下所示:
@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.
}
我正在尝试使用 Hibernate Criteria api 仅获取基于 USER_ID
的主题,但不知道如何使用该标准进行操作。
我的表是 "topic_users"(下)
和"topics"table(下)
我知道如何使用 SQL,这类似于:
SELECT TOPICNAME
FROM topic_users INNER JOIN topics on topic_users.TOPICS_TOPICS_ID = topics.TOPICS_ID
WHERE topic_users.USER_ID = 1
这将 return USER_ID
1 的所有 TOPICNAME
这正是我想要的,但我如何使用 Hibernate Criteria 来做到这一点。到目前为止,我的存储库 class 中有这个(见下文),但这只会 return 一个高度嵌套的 JSON 数组。我可以遍历对象,使用 DTO 并构建我的响应或尝试 Hibernate createSQLQuery
方法,它可以让我直接调用本机 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;
}
和我的 TOPIC_USERS
实体,我在其中映射了 TOPICS
@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
好的,从头开始..你的实体 classes 应该是这样的:
@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;
您的主题 class 应如下所示:
@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.
}