У меня есть отношение «многие ко многим» между пользователем и местоположением, которое было определено и работает хорошо; все проблемы начались, когда я должен использовать часть составного ключа для выполнения поиска данных.
Модель бизнес-пользователя определяется следующим образом:
@Table(name = "BusinessUser")
public class User {
private String userId;
private String userAuthId;
private Set<UserLocation> userLocations;
@Id
public String getUserId () {
return userId;
}
public void setUserId ( String userId ) {
this.userId = userId;
}
public User () {
userLocations = new HashSet<>();
}
@JsonManagedReference
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
public Set<UserLocation> getUserLocations () {
return userLocations;
}
public void setUserLocations ( Set<UserLocation> userLocations ) {
this.userLocations = userLocations;
}
}
Объект местоположения определяется следующим образом:
public class Location {
private String locationId;
private String googlePlacesId;
private Set<UserLocation> userLocations;
@Id
public String getLocationId () {
return locationId;
}
public void setLocationId ( String locationId ) {
this.locationId = locationId;
}
public Location () {
userLocations = new HashSet<>();
}
@JsonManagedReference
@OneToMany(mappedBy = "location")
public Set<UserLocation> getUserLocations () {
return userLocations;
}
public void setUserLocations ( Set<UserLocation> userLocations ) {
this.userLocations = userLocations;
}
}
И таблица UserLocation выглядит следующим образом:
@Entity
@Table(name="user_location")
@IdClass(UserLocation.UserLocationId.class)
public class UserLocation implements Serializable {
private User user;
private Location location;
private Date createdDate;
@Id
@ManyToOne
@JsonBackReference
@JoinColumn(name = "userId")
public User getUser () {
return user;
}
public void setUser ( User user ) {
this.user = user;
}
@Id
@ManyToOne
@JsonBackReference
@JoinColumn(name = "locationId")
public Location getLocation () {
return location;
}
public void setLocation ( Location location ) {
this.location = location;
}
public Date getCreatedDate () {
return createdDate;
}
public void setCreatedDate ( Date createdDate ) {
this.createdDate = createdDate;
}
Это было сделано для того, чтобы обеспечить согласованное сопоставление между пользователем и местоположением. Но проблема возникает сейчас; где у меня есть userID и на основании этого мне нужно получить все LocationId из таблицы UserLocation. Как только у меня будет весь идентификатор местоположения, я могу получить все объекты местоположения.
Мой JPARepository для UserLocation был создан следующим образом:
@Repository
public interface UserLocationRepository extends JpaRepository<UserLocation,Long> {
List<UserLocation> findByUser ( User user);
}
Это лучший способ определения этих отношений.
Как я могу получить значение Location с учетом только userID
Я вижу ошибку IdClass, для которой я определил класс ID и добавил то же самое.
Как только я это делаю, я вижу постоянную ошибку Id. Любые подсказки?