贴一个之前做过的社区(省略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;
@JsonIgnore
@OneToMany(cascade=javax.persistence.CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="topic")
private List 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;
@JsonIgnore
@OneToMany(cascade=javax.persistence.CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="comments")
private List 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;
/** 评论 */
@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 findByKeyword(final String keyword, int pageNumber, int pageSize) {
// 过滤条件
Specification spec = new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) {
List predicates = Lists.newArrayList();
if (StringUtils.isNotEmpty(keyword)) {
Predicate predicateT = builder.like(root. get("title"), "%/" + keyword + "%", '/');
Predicate predicateP = builder.like(root. get("profile"), "%/" + keyword + "%", '/');
Predicate predicateI = builder.like(root. get("imageUrl"), "%/" + keyword + "%", '/');
Predicate predicateU = builder.like(root. get("url"), "%/" + keyword + "%", '/');
predicates.add(builder.or(predicateT, predicateP, predicateI, predicateU));
}
predicates.add(builder.equal(root. get("delFlag"), Topic.DEL_FLAG_NORMAL));
predicates.add(builder.equal(root. 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 orderList = new ArrayList();
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 findMuByselfId(String id);
//jpa:
//@Query(value = "from MultistageComments where comments_id = (?1) and del_flag=0 order by create_date desc")
// List findByKeywords(String keyword);
//nativeQuery=true 如果需要分页还是用原声的要方便 因为dao层在继承PagingAndSortingRepository 对象后后可以直接返回封装后的page对象,
//贴一下 该对象就知道了
@NoRepositoryBean //page就是封装的分页对象.
public interface PagingAndSortingRepository extends CrudRepository {
/**
* Returns all entities sorted by the given options.
*
* @param sort
* @return all entities sorted by the given options
*/
Iterable 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 findAll(Pageable pageable);
}
|