I decided to create filters in my application with Spring Specification. Everything was going well but I don’t know to do filter User events. Which filter events by user login.
My entities look like this:
@Entity
public class EventEntity {
@Id
private Long id;
@ManyToMany(mappedBy="events")
private Set<UserEntity> participants = new HashSet<>();
}
@Entity
public class UserEntity {
@Id
private String login;
@ManyToMany
@JoinTable(
name="user_events",
joinColumns = @JoinColumn(name = "user_login"),
inverseJoinColumns = @JoinColumn(name = "event_id")
)
private Set<EventEntity> events = new HashSet<>();
}
I read many subjects on stack but still don’t know to how to implement my filter logic and filter beginning looks like this:
private Specification<EventEntity> findUserEvent(String login) {
return (root, cq, cb) -> {
if(login.isEmpty()) return cb.conjunction();
Root<EventEntity> event = cq.from(EventEntity.class);
Join<EventEntity, UserEntity> users = event.join(EventEntity_.PARTICIPANTS)
return builder.equals ???
}
}
Advertisement
Answer
I created the same models and entered a few sample data.
You can see this data as follows:
Let’s write in your specification code as follows:
private Specification<EventEntity> findUserEvent(String login) {
return (root, cq, cb) -> {
if (login.isEmpty()) return cb.conjunction();
Join<EventEntity, UserEntity> join = root.join("participants");
return cb.equal(join.get("login"), login);
};
}
When we use the specification code to get user-c user’s events, 2 events will return.
List<EventEntity> events = eventEntityRepository
.findAll(findUserEvent("user-c"));
System.out.println(events.size());
If something different is happening, first check that you have records in your database and if the metadata definitions contain correct values.
