jpa 中的一对多,多对一关系设置,可直接用findall方法查询出所需的数据,非常方便

来源:互联网 发布:数据的逻辑结构 编辑:程序博客网 时间:2024/04/29 00:42

贴一个之前做过的社区(省略get和set):

  通过下面的设置, 要是你的框架没什么问题的话,就可以直接生成表,表字段,表关系,还可以设置注释,等等, 主要是一对多,多对多等关系, 一目了然

话题表 :

/** * 话题实体 *  * @author zb * */@Entity@Table(name = ""这里设置表名")public class Topic extends BaseEntity{private static final long serialVersionUID = -337820391660026719L;@Id@GeneratedValue(generator = "UIDGenerator")@GenericGenerator(name = "UIDGenerator", strategy = "com.comtop.msp.framework.persistence.UIDGenerator")@Column(length = 40)private String topicId; /** 发布时间  */    @Temporal(TemporalType.TIMESTAMP)    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")    @Column(updatable = true)    private Date publishDate;/** 图片地址 */@Column(length = 100)private String imageUrl;/** 话题标题 */@Column(length = 80)private String title;/** 说明 */@Column(length = 100)private String explains;/** 真实浏览 */@Column(length = 1)private Integer realScan;/** 虚拟浏览 */@Column(length = 1)private Integer falseScan;/** 排序 */@Column(length = 1)private Integer sort;/** 是否显示 */@Column(length = 1)private Integer displayStatus;/** 所在租户 */@JoinColumn(name = "tenantId")@ManyToOne(optional = true)@JsonIgnoreprivate Tenant tenant; @JsonIgnore@OneToMany(cascade=javax.persistence.CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="topic")private List<Comments> comments;@JsonIgnore@OneToMany(cascade=javax.persistence.CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="topic")private List<TopicLike> TopicLike; @Transient private Integer commentsCount;  @Transientprivate Integer sortCount;
评论表:
/** * 一级评论实体 *  * @author zb * */@Entity@Table(name = "这里设置表名")public class Comments extends BaseEntity {private static final long serialVersionUID = -337820391660026719L;@Id@GeneratedValue(generator = "UIDGenerator")@GenericGenerator(name = "UIDGenerator", strategy = "com.comtop.msp.framework.persistence.UIDGenerator")@Column(length = 40)private String commentsId;/** 话题Id */@JoinColumn(name = "topicId")@ManyToOne(cascade = CascadeType.REFRESH, optional = true)@JsonIgnoreprivate Topic topic;/** 评论用户id */@JoinColumn(name = "userId")@ManyToOne(cascade = CascadeType.REFRESH, optional = true)@JsonIgnoreprivate User user;/** 评论 */@Column(columnDefinition = "TEXT")private String description;@JsonIgnore@OneToMany(cascade=javax.persistence.CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="comments")private List<CommentLike> commentLike;@JsonIgnore@OneToMany(cascade=javax.persistence.CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="comments")private List<MultistageComments>  multistageComments; /** 发布时间  */    @Temporal(TemporalType.TIMESTAMP)    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")    @Column(updatable = true)    private Date publishDate;    /** 排序 */@Column(length = 1)private Integer sort;/** 评论点赞数 */@Column(length = 1)private Integer likeCount;
}
 
多级回复:
@Entity@Table(name = "这里设置 ")public class MultistageComments extends BaseEntity {private static final long serialVersionUID = -33820391660026719L;@Id@GeneratedValue(generator = "UIDGenerator")@GenericGenerator(name = "UIDGenerator", strategy = "com.comtop.msp.framework.persistence.UIDGenerator")@Column(length = 40)private String multisId;@JoinColumn(name = "replyToUserId")@ManyToOne(cascade = CascadeType.REFRESH, optional = true)@JsonIgnoreprivate User users;@JoinColumn(name = "commentsId")@ManyToOne(cascade = CascadeType.REFRESH, optional = true)@JsonIgnoreprivate Comments comments;/** 评论用户id */@JoinColumn(name = "userId")@ManyToOne(cascade = CascadeType.REFRESH, optional = true)@JsonIgnoreprivate User user;@JsonIgnore@OneToMany(cascade = javax.persistence.CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "multistageComments")private List<CommentLike> commentLike;/** 评论 */@Column(columnDefinition = "TEXT")private String description;@Column(length = 40)private String selfmultisId;   /** 发布时间  */    @Temporal(TemporalType.TIMESTAMP)    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")    @Column(updatable = true)    private Date publishDate;   }
点赞表:
@Entity@Table(name = "这里设置表名")public class CommentLike extends BaseEntity {private static final long serialVersionUID = -3378203916620026719L;// 主键id@Id@GeneratedValue(generator = "UIDGenerator")@GenericGenerator(name = "UIDGenerator", strategy = "com.comtop.msp.framework.persistence.UIDGenerator")@Column(length = 40)private String clId;/** 点赞评论id */@JoinColumn(name = "commentsId")@ManyToOne(cascade = CascadeType.REFRESH, optional = true)@JsonIgnoreprivate Comments comments;/** 回复 id */@JoinColumn(name = "multisId")@ManyToOne(cascade = CascadeType.REFRESH, optional = true)@JsonIgnoreprivate MultistageComments multistageComments;/** 点赞人id */@JoinColumn(name = "likeUserId")@ManyToOne(cascade = CascadeType.REFRESH, optional = true)@JsonIgnoreprivate User user;/** 被点赞人id */@JoinColumn(name = "bylikeUserId")@ManyToOne(cascade = CascadeType.ALL, optional = true)@JsonIgnoreprivate User buser; /** 发布时间  */    @Temporal(TemporalType.TIMESTAMP)    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")    @Column(updatable = true)    private Date publishDate;}
       /** * 根据关键词查询所有记录 * 关系理清楚之后,贴种通用查询方法,如果没有什么特殊的要求,通常这个方法就能全部搞定了,直接改改就能使用了 * @param keyword *            关键词 * @return 结果集合 */public Page<Topic> findByKeyword(final String keyword, int pageNumber, int pageSize) {// 过滤条件Specification<Topic> spec = new Specification<Topic>() {@Overridepublic Predicate toPredicate(Root<Topic> root, CriteriaQuery<?> query, CriteriaBuilder builder) {List<Predicate> predicates = Lists.newArrayList();if (StringUtils.isNotEmpty(keyword)) {Predicate predicateT = builder.like(root.<String> get("title"), "%/" + keyword + "%", '/');Predicate predicateP = builder.like(root.<String> get("profile"), "%/" + keyword + "%", '/');Predicate predicateI = builder.like(root.<String> get("imageUrl"), "%/" + keyword + "%", '/');Predicate predicateU = builder.like(root.<String> get("url"), "%/" + keyword + "%", '/');predicates.add(builder.or(predicateT, predicateP, predicateI, predicateU));}predicates.add(builder.equal(root.<String> get("delFlag"), Topic.DEL_FLAG_NORMAL));predicates.add(builder.equal(root.<String> get("delFlag"), Comments.DEL_FLAG_NORMAL));root.get("tenant").get("tenantId");          Predicate p1 = builder.equal(root.get("tenant").get("tenantId"), UserUtils.getTenantId());         predicates.add(p1);// 将所有条件用 and 联合起来if (predicates.size() > 0) {return builder.and(predicates.toArray(new Predicate[predicates.size()]));}return builder.conjunction();}};List<Order> orderList = new ArrayList<Order>();orderList.add(new Order(Direction.DESC, "sort"));orderList.add(new Order(Direction.DESC, "createDate"));PageRequest pageRequest = new PageRequest(pageNumber - 1, pageSize, new Sort(orderList));return topicDao.findAll(spec, pageRequest);}

//下面贴下dao层如何写jpa 和 原声sql //写原生sql: //@Query(value = "select * from  msp_topics_multistage_comments where selfmultis_id =(?1) " ,nativeQuery=true )//List<MultistageComments> findMuByselfId(String id);//jpa://@Query(value = "from MultistageComments  where comments_id = (?1)  and del_flag=0  order by create_date desc")//    List<MultistageComments> findByKeywords(String keyword);//nativeQuery=true  如果需要分页还是用原声的要方便  因为dao层在继承PagingAndSortingRepository 对象后后可以直接返回封装后的page对象,//贴一下 该对象就知道了 
@NoRepositoryBean //page就是封装的分页对象.public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {/** * Returns all entities sorted by the given options. *  * @param sort * @return all entities sorted by the given options */Iterable<T> findAll(Sort sort);/** * Returns a {@link Page} of entities meeting the paging restriction provided in the {@code Pageable} object. *  * @param pageable * @return a page of entities */Page<T> findAll(Pageable pageable);}
 
原创粉丝点击