贴一个之前做过的社区(省略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)
@JsonIgnore
private 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;
@Transient
private 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) @JsonIgnore private Topic topic; /** 评论用户id */ @JoinColumn(name = "userId") @ManyToOne(cascade = CascadeType.REFRESH, optional = true) @JsonIgnore private 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) @JsonIgnore private User users; @JoinColumn(name = "commentsId") @ManyToOne(cascade = CascadeType.REFRESH, optional = true) @JsonIgnore private Comments comments; /** 评论用户id */ @JoinColumn(name = "userId") @ManyToOne(cascade = CascadeType.REFRESH, optional = true) @JsonIgnore private 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) @JsonIgnore private Comments comments; /** 回复 id */ @JoinColumn(name = "multisId") @ManyToOne(cascade = CascadeType.REFRESH, optional = true) @JsonIgnore private MultistageComments multistageComments; /** 点赞人id */ @JoinColumn(name = "likeUserId") @ManyToOne(cascade = CascadeType.REFRESH, optional = true) @JsonIgnore private User user; /** 被点赞人id */ @JoinColumn(name = "bylikeUserId") @ManyToOne(cascade = CascadeType.ALL, optional = true) @JsonIgnore private 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>() { @Override public 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); }