【问题标题】:Hibernate Criteria One to Many issuesHibernate Criteria 一对多问题
【发布时间】:2017-01-20 20:41:58
【问题描述】:

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

我的表格是“topic_users”(如下)

和“主题”表(下)

我知道如何使用 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 方法,它可以让我直接调用本机 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

【问题讨论】:

  • 可以添加Topic实体类吗?

标签: java hibernate jpa hibernate-criteria


【解决方案1】:

好的,从头开始......你的实体类应该是这样的:

@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;

您的主题类应如下所示:

@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.

}

【讨论】:

  • 正确,尝试了你的建议,它就像一个魅力。当你去都柏林时,给你一大品脱的吉尼斯啤酒。
  • 我差点在那里签合同,但最后还是留在了伦敦……下次!
猜你喜欢
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多