2014-04-15 21 views
8

Tôi đang sử dụng dữ liệu spring jpa và querydsl và bị mắc kẹt về cách viết truy vấn đơn giản tốt đẹp để bên trái nối hai bảng. Giả sử tôi có một tổ chức dự án và tổ chức công tác với mối quan hệ OneToMany quy định tại Dự án, tôi muốn làm một cái gì đó như:tham gia trái với jpa dữ liệu mùa xuân và querydsl

select * from project p left join task t on p.id = t.project_id where p.id = searchTerm 
select * from project p left join task t on p.id = t.project_id where t.taskname = searchTerm 

Trong JPQL, nó phải là:

select distinct p from Project p left join p.tasks t where t.projectID = searthTerm 
select distinct p from Project p left join p.tasks t where t.taskName = searthTerm 

Tôi có một Giao diện ProjectRepository, mở rộng JpaRepository và QueryDslPredicateExecutor. Đó mang lại cho tôi tiếp cận với phương pháp:

Page<T> findAll(com.mysema.query.types.Predicate predicate, Pageable pageable) 

Tôi biết rằng trái tham gia có thể dễ dàng đạt được bằng cách tạo ra một JPAQuery mới (EntityManager). Nhưng tôi không có người quản lý thực thể được tiêm một cách rõ ràng với jpa dữ liệu mùa xuân. Có cách nào tốt đẹp và đơn giản để xây dựng một biến vị ngữ với phép nối trái không? Chúc ai đó ở đây đã trải nghiệm điều này và có thể cho tôi một ví dụ. Cảm ơn bạn.

Frey.

+0

Bạn có thể diễn đạt những gì bạn cần trong JPQL chứ không phải trong SQL không? Tôi bây giờ không chắc chắn nếu bạn cần tham gia trái để tải hoặc cái gì khác. –

+0

Xin chào Timo, biểu thức JPQL được thêm vào theo yêu cầu –

Trả lời

6

Nếu bạn muốn bày tỏ một hạn chế về nhiệm vụ thì bạn có thể làm điều đó như thế này

QProject.project.tasks.any().id.eq(searchTerm) 

Nếu bạn muốn bày tỏ nạp trước các nhiệm vụ nhất định thay vì thông qua một trái join bạn không thể diễn tả điều đó thông qua một Predicate . Một Predicate trong Querydsl là một biểu thức boolean cho nơi, tham gia và có các phần của truy vấn.

+0

Xin chào Timo, cảm ơn bạn đã trả lời. Bạn có nghĩa là any() chỉ có thể cung cấp ràng buộc, mà không tải dữ liệu từ bảng bên ngoài? –

+0

Có, giải pháp này chỉ cung cấp một hạn chế về kết quả, nó không ảnh hưởng đến tải –

Các vấn đề liên quan