注意點:
1: 不要動輒就配置@OneToOne @OneToMany @ManyToOne @ManyToMany;
根據業(yè)務想清楚當前實體需不需要關聯(lián)的實體詳情,需要在配置;
否則這種配置會增加sql查詢,需進一步增加優(yōu)化操作,增加不必要的麻煩!
示例1(配置了不必要的關聯(lián)關系):
@Entity
@Table(name = "sb_review")
public class Review {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 評論
*/
@Column(name = "content",length = 2048)
private String reviewContent;
/**
* 內容id
*/
@Column(name = "reference_id",length = 2048)
private Long referenceId;
/**
* 當前評論的人
*/
@ManyToOne(targetEntity = Account.class,optional = false)
@JoinColumn(name = "review_account_id", nullable = false,referencedColumnName = "id")
private Account account;
get/setxxx ......
}
紅色部分就是不必要的關聯(lián)配置,這種配置在進行from Review的時候會關聯(lián)查詢account實體,多出不必要的sql,如果要優(yōu)化,就還得Dao增加自定義的@Query注解方法,比較麻煩
而實際業(yè)務可能并不需要當前評論人的詳細信息,
改進后:@Entity
@Table(name = "sb_review")
public class Review {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 評論
*/ @Column(name = "content",length = 2048)
private String reviewContent;
/**
* 內容id
*/ @Column(name = "reference_id",length = 2048)
private Long referenceId;
/**
* 當前評論的人
*/ @Column(name="review_account_id") private Long reviewAccountId; get/setxxx


}
紅色部分就配置屬性即可,從內容方進行關聯(lián)查詢多個評論的時候,就不會多出查詢賬戶信息的sql。
2: 只要@Query使用jpql方式,那么方法入參加入pageable仍然可以正常分頁,但是無法用fetch! 示例:
@Query(value = "select s from ShareCare s left join s.reviewList ")
Page<ShareCare> findAllWithReviews(Pageable pageable);
3:做好第一步,領域模型配置好關聯(lián)關系后,看情況采用@Query注解查詢方式,增加join fetch操作可以減少sql查詢
posted on 2017-11-17 14:19
朔望魔刃 閱讀(3200)
評論(0) 編輯 收藏 所屬分類:
java