【问题标题】:Query dsl with predicate and fetch join使用谓词查询 dsl 并获取连接
【发布时间】:2018-06-04 17:03:37
【问题描述】:

是否有机会使用谓词获取连接实体?

    @Entity
public class Student {

    @Id
    private int id;

    private String hobby;

    private String favouriteColor;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
    @JoinColumn(name = "CLASS_ID", referencedColumnName = "ID")
    private Classroom classroom;
}

@Entity
public class Classroom {

    @Id
    private int id;

    private String classRoom;

    private List<Student> students;

}

我有一些谓词

public class StudentPredicate {

    private StudentPredicate() {}

    public static Predicate createPredicate(final Student filter) {
        QStudent student = QStudent.student;

        BooleanBuilder builder = new BooleanBuilder();

        if (isNotBlank(filter.getHobby())) {
            builder.and(student.hobby.eq(filter.getHobby());
        }
        if (isNotBlank(filter.getFavouriteColor())) {
            builder.and(student.favouriteColor.eq(filter.getFavouriteColor()));
        }


        return builder.getValue();
    }

}

和存储库

@Repository
public interface StudentRepository extends CrudRepository<Student, Integer>, QueryDslPredicateExecutor<Student> {

}

现在我怎样才能找到所有已获取教室的学生?

studentRepository.findAll(predicate)

查询dsl这些findAll应该取教室怎么说?

【问题讨论】:

    标签: java spring-data spring-data-jpa querydsl


    【解决方案1】:

    由于 Student 类中的教室字段有 FetchType.LAZY,所以当您调用 getClassRoom() 时,实际上会从 db 中获取相关实体,或者您可以使用FetchType.EAGER

    【讨论】:

    • 是的,我知道,但其他一些东西只需要使用 Student 而无需获取 ClassRoom。因此,我认为对于使用 Predicate 的给定查询是否有像“FETCH JOIN”这样的可能性
    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2021-05-08
    • 2017-10-03
    • 2023-01-25
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多