我有以下实体:
@Entity
@Table(name = "user_data")
public class UserData {
...
@ManyToOne
private User user;
...
}
@Entity
@Table(name = "user_cars")
public class UserCar {
...
private Integer userId;
...
}
@Entity
@Table(name = "users")
public class User {
...
@OneToMany(mappedBy = "userId", cascade = CascadeType.ALL)
private List<UserCar> userCars;
...
}
如您所见,userCars 是延迟加载的(我不打算更改它)。现在我使用规范来获取用户数据:
public Page<UserData> getUserData(final SpecificationParameters parameters) {
return userDataRepository.findAll(createSpecification(parameters), parameters.pageable);
}
private Specification<UserData> createSpecification(final SpecificationParameters parameters) {
final var clazz = UserData.class;
return Specification.where(buildUser(parameters.getUserId()));
}
private Specification<UserData> buildUser(final Integer userId) {
return (root, criteriaQuery, criteriaBuilder) -> {
if (Objects.nonNull(userId)) {
final Join<UserData, User> joinParent = root.join("user");
return criteriaBuilder.equal(joinParent.get("id"), userId);
} else {
return criteriaBuilder.isTrue(criteriaBuilder.literal(true));
}
};
}
但我不知道如何在其中添加获取连接子句以获取用户汽车。我试图将它添加到不同的地方,但我得到了 LazyInitializationException(所以它不起作用)或其他一些异常...
最佳答案
方法与之前的答案略有不同,但我认为 jcc 提到的想法是正确的,即“Hibernate 正在提示,因为它无法找到 userCars 关系的所有者,在这种情况下是用户。”
为此,我想知道对象关系引擎是否因为您直接链接到 userId(原语)而不是 User(实体)而感到困惑。我不确定它是否可以假设“userId”原语必然暗示与用户实体的连接。
您能否尝试重新安排映射,使其不使用连接表中的整数 UserId 而是使用对象本身,然后查看它是否允许实体管理器更好地理解您的查询?
所以映射可能看起来像这样:
@Entity
@Table(name = "user_cars")
public class UserCar {
...
@ManyToOne
@JoinColumn(name="user_id", nullable=false) // Assuming it's called user_id in this table
private User user;
...
}
@Entity
@Table(name = "users")
public class User {
...
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<UserCar> userCars;
...
}
关于java - 使用 Spring 规范从另一个对象获取连接到属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67106002/