2017-03-08 3 views
0

ドメインから選択したデータのみを取得するための素晴らしい解決策は見つかりませんか? は、例えば、私はクラスがあります。JPAクエリーから選択したデータのみを取得する

@Entity 
public class Reservation { 

// private Integer RESERVATION_ID; 
// private Integer id; 
private long code; 
private Date date; 
private Client reservationClient; 
private WashType reservationWashType; 
private Vehicle reservationVehicle; 
private Wash reservationWash; 
private Worker reservationWorkerPesel; 
private Review reservationReview; 
private ReservationReminder reservationReminder; 
} 

を、簡単なクエリリポジトリ

public interface ReservationRepository extends JpaRepository<Reservation, Long> { 
Reservation findByCode(long code); 
} 

を持っている私は、そのクエリから予約オブジェクトを利用したいが、レビュー、労働者のようなクラスからのデータのなしと思います。 だから、のように私の結果が見えるはずです意味:含まれる予約のオブジェクト全体 : コード、日付、クライアントreservationClient、WashType reservationWashType、車両reservationVehicle、ウォッシュreservationWash、ReservationReminder reservationReminder

はそれを除外することが可能ですいい方法で?それとも、どうすればそれを管理できますか?

+0

予約オブジェクトが実際に必要だと言っているので、頼んだものではありませんが、投影によって問題が解決される可能性があります。https://docs.spring.io/spring-data/jpa/docs/current/reference/html /#投影図 –

答えて

0

はい、ReviewWorkerが遅れて表示されている限り、簡単に行うことができます。私は何を意味

です:Hibernateはあなたが#getReview()を呼び出すまでReview関連をロードしようとしません

@ManyToOne(fetch = FetchType.LAZY) 
private Review review; 

ReservationReviewを追加したい場合は、照会時に関係をjoin-fetchedにする必要があります。

@Query("SELECT r FROM Reservation r JOIN FETCH r.review WHERE r.code = :code") 
List<Reservation> findByCode(Long code); 

ReviewはNULLにすることはできません場合はインクルードが生成されます参加するとき、それは、内側ではなく外側よりも参加するパフォーマンスのオーバーヘッドを回避するために参加使用するように、 @ManyToOneoptional=false属性を持っていることを確認して、覚えておいてください。

+0

さて、あなたは理解していますが、私はこれを手に入れることができません: '@Query("予約rからJOIN FETCH r.review WHERE r.code =:code ")' レビュー? Ifは、すべてのサブクラスを取得したいが遅延ロードを使用することはどうですか? – bielas

+0

それはまさに 'JOIN FETCH'がするものです。基本的には、クエリ時にHibernateがベースクエリ内のそれらの関連をロードするように、マッピングモデル内の遅延フェッチをオーバーライドする方法です。 'SELECT r FROM予約r rOre FETCH r.review JOIN FETCH r.workerどこr.code =:コード' – Naros

関連する問題