注意点:
1: 不要动辄就配置@OneToOne @OneToMany @ManyToOne @ManyToMany;
根据业务想清楚当前实体需不需要关联的实体详情,需要在配置;
否则这种配置会增加sql查询,需进一步增加优化操作,增加不必要的麻烦!
示例1(配置了不必要的关联关系):
@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 ......
}
红色部分就是不必要的关联配置,这种配置在进行from Review的时候会关联查询account实体,多出不必要的sql,如果要优化,就还得Dao增加自定义的@Query注解方法,比较麻烦
而实际业务可能并不需要当前评论人的详细信息,
改进后:@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
}
红色部分就配置属性即可,从内容方进行关联查询多个评论的时候,就不会多出查询账户信息的sql。
2: 只要@Query使用jpql方式,那么方法入参加入pageable仍然可以正常分页,但是无法用fetch! 示例:
@Query(value = "select s from ShareCare s left join s.reviewList ")
Page<ShareCare> findAllWithReviews(Pageable pageable);
3:做好第一步,领域模型配置好关联关系后,看情况采用@Query注解查询方式,增加join fetch操作可以减少sql查询
posted on 2017-11-17 14:19
朔望魔刃 阅读(3184)
评论(0) 编辑 收藏 所属分类:
java