java - 如何使用不直接在实体 hibernate spring JPA 上的属性进行 findBy 操作

标签 java hibernate spring-data-jpa

我有三个具有以下关系的实体 实体用户有许多带有连接表的 Activity (单向关系),因为我需要关系属性, 规则实体有很多 Activity (双向关系)

我可以执行 findBy 来搜索来自一个特定规则的 Activity 吗? 听起来有可能,因为 Activity 有规则,但我不知道如何使用 Hibernate 来做到这一点

这是我来自两种关系的代码

编辑:我已经用 MySQL 进行了测试,我需要的查询是这个

select * from user_activity where user_id = userIdValue and activity_id in (
select id from activity where rule_id = rule_idValue);

如何在 spring 上使用 hibernate 执行该查询?

用户 Activity (带有关系属性的连接表)

@Entity
@Table(name="USER_ACTIVITY")
public class JoinedUserActivity {

public JoinedUserActivity() {}

public JoinedUserActivity(JoinedUserActivityId joinedUserActivityId, String fileName) {
    this.joinedUserActivityId = joinedUserActivityId;
    this.fileName  = fileName;
    this.score = 0;
    this.lastHint = 0;
}
private String fileName; //user activity filename
@ManyToOne
@JoinColumn(name="ACTIVITY_ID", insertable=false, updatable=false)
private Activity activity;


private Integer score;
private Integer lastHint; 

public Activity getActivity() {
    return activity;
}

public void setActivity(Activity activity) {
    this.activity = activity;
}
//more set and gets
@EmbeddedId
private JoinedUserActivityId joinedUserActivityId;


// required because JoinedUserAchievments contains composite id
@Embeddable
public static class JoinedUserActivityId implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -9180674903145773104L;


    @ManyToOne
    @JoinColumn(name="USER_ID")
    private User user;

    @ManyToOne
    @JoinColumn(name="ACTIVITY_ID")
    private Activity activity;

    // required no arg constructor
    public JoinedUserActivityId() {}

    public JoinedUserActivityId(User user, Activity activity) {
        this.user = user;
        this.activity = activity;
    }

    public JoinedUserActivityId(Integer userId, Integer activityId) {
        this(new User(userId), new Activity(activityId));
    }

    public User getUser() {
        return user;
    }


    public Activity getActivity() {
        return activity;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public void setActivity(Activity activity) {
        this.activity = activity;
    }
    @Override

    public boolean equals(Object instance) {
        if (instance == null)
            return false;

        if (!(instance instanceof JoinedUserActivityId))
            return false;

        final JoinedUserActivityId other = (JoinedUserActivityId) instance;
        if (!(user.getId().equals(other.getUser().getId())))
            return false;

        if (!(activity.getId().equals(other.getActivity().getId())))
            return false;

        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 47 * hash + (this.user != null ? this.user.hashCode() : 0);
        hash = 47 * hash + (this.activity != null ? this.activity.hashCode() : 0);
        return hash;
    }
  }
}

用户

@OneToMany(cascade=CascadeType.ALL, mappedBy="joinedUserActivityId.user")
private List<JoinedUserActivity> joinedUserActivityList = new ArrayList<JoinedUserActivity>();

Activity 没有有关用户的信息,因为它是单向的。

现在我的 Activity 规则没有连接表并且是双向的,代码如下 Activity.java

@JsonIgnore
@ManyToOne
Rule rule;

规则.java

 @OneToMany(cascade=CascadeType.ALL, mappedBy="rule")
 private List<Activity> ListActivities = new ArrayList<Activity>();

所以...在连接表 user_activity 上,我可以定义一个 findBy 函数来返回哪些 Activity 具有来自一条规则的一个用户吗?

我已经做到了

@Override
JoinedUserActivity findOne(JoinedUserActivityId id);

这会返回一个用户的一个 Activity 但我不知道如何按规则过滤

最佳答案

不需要您的子查询。您所需要的只是加入。

在 JPQL 中:

select distinct jua from JoinedUserActivity jua
where jua.user.id = :userId
and jua.activity.rule.id = :ruleId

或者,使用显式连接:

select distinct jua from JoinedUserActivity jua
join jua.user u
join jua.activity a
join a.rule r
where u.id = :userId
and r.id = :ruleId

现在只需在 Spring-data 存储库接口(interface)中添加所需的方法,并用 @Query 对其进行注释,并将上述查询之一作为值。

关于java - 如何使用不直接在实体 hibernate spring JPA 上的属性进行 findBy 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51867393/

相关文章:

jpa - 在 WHERE 中使用 "CASE WHEN"语句进行查询会导致 QuerySyntaxException : unexpected AST

java - 实体图不起作用 - 返回所有实体

java - 可能的选择数量有限?

java - 应用程序图标上的新通知计数弹出窗口

java - 错误 "Mapping (RESOURCE) not found : HibernateExposed/Person.hbm.xml"

java - 在 Hibernate 3 上禁用透明持久化

java - 使用类似于 @Size 的参数进行自定义 JPA Bean 验证

java - 无法将 mssql 时间戳列映射到 hibernate

Java 字符串特殊字符替换

java - Hibernate - 通过更新父对象创建子对象,但需要生成子对象的 key