我有下一個關系:
CREATE TABLE IF NOT EXISTS users
(
id BIGSERIAL PRIMARY KEY
);
CREATE TABLE IF NOT EXISTS groups
(
id BIGSERIAL PRIMARY KEY
);
CREATE TABLE users_groups
(
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users (id),
group_id BIGINT REFERENCES groups (id)
);
CREATE TABLE IF NOT EXISTS attempts
(
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users (id)
);
@Entity
@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(mappedBy = "users", fetch = FetchType.LAZY)
@ToString.Exclude
private Set<Group> groups;
@ToString.Exclude
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Attempt> attempts;
}
@Entity
@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "groups")
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "users_groups",
joinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
@ToString.Exclude
private List<User> users;
}
@Getter
@Setter
@Entity
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "attempts")
public class Attempt {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ToString.Exclude
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
}
我AttemptSpecification的問題的目標是:
record AttemptSpecification(@NotNull Group group) implements Specification<Attempt> {
@NotNull
@Override
public Predicate toPredicate(@NotNull Root<Attempt> root,
@NotNull CriteriaQuery<?> query,
@NotNull CriteriaBuilder builder) {
Predicate predicate = builder.conjunction();
List<Expression<Boolean>> exps = predicate.getExpressions();
....?
return predicate;
}
}
我需要attempts按組從表中獲取資料JpaSpecificationExecutor::Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable)。
如何構建Predicate與CriteriaBuilder 包含在某個組中的用戶相關的選擇嘗試?如何加入groupstousers和usersto attempts?
uj5u.com熱心網友回復:
- join - 可能需要不同的,因此可能由于分頁而無法使用:
(root, cq, cb) -> {
Root<Group> groups = cq.from(Group.class);
Join<Group, User> userJoin = groups.join(Group_.users);
return cb.and(
cb.equal(root.get(Attempt_.user), userJoin),
groups.in(grList)
);
}
- 半聯接:
(root, cq, cb) -> {
Subquery<Long> groupSubQ = cq.subquery(Long.class);
Root<Group> groups = groupSubQ.from(Group.class);
Join<Group, User> userJoin = groups.join(Group_.users);
groupSubQ.select(cb.literal(1L)).where(
groups.in(grList),
cb.equal(root.get(Attempt_.user), userJoin)
);
return cb.exists(groupSubQ);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/515514.html
標籤:爪哇休眠休眠标准
