java - 使用 Spring 规范从另一个对象获取连接到属性

标签 java spring spring-boot spring-data-jpa spring-data

我有以下实体:

@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;
    ...
}

这样也更符合 https://www.baeldung.com/hibernate-one-to-many

关于java - 使用 Spring 规范从另一个对象获取连接到属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67106002/

相关文章:

java - 如何使用 liquibase 将数据库回滚到 Spring Boot 中的特定变更集 ID?

java - 适用于 Android 的 Dagger : Injecting an Activity to the object graph after calling setContentView

java - Spring Boot 1.2.5.RELEASE - 通过 Gmail SMTP 发送电子邮件

javascript - thymeleaf 表达式

java - Spring Batch 和 Spring 集成。无法配置JobListener

java - Spring @RestController 响应已提交

java - 用户身份验证失败时出现 Spring Security ProviderNotFoundException

java - 将一个对象的属性转换为另一个对象

java - Arrays.sort从较高的数字到较低的数字?

java - 使用 Spring Boot 和 RabbitMQ 进行异步请求-回复