jpa

方便行事,个人约定:

A.只允许@ManyToOne和@OneToOne注解;  B.不许配cascade,需要处理的自己写; C.使用 @NotFound(action=NotFoundAction.IGNORE)与延迟加载互斥,影响一定性能;

1.dao继承两个接口一个是JpaRepository,一个是个人的接口ArticleRepository

eg:public interface ArticleDao extends JpaRepository<Article,Integer>,ArticleRepository

2.目的:

extends JpaRepository: 目的是方便@Query直接写代码并自动封装,同时利用其集成的方法. 但是它只支持精准匹配(字符串除外可以like),比如大于等于,范围查询都不支持. 所以=>①只用它的----增删改 + 查1个,查全部,还有智能方法; ②其他>,>,in,like,Hql在@Query中写(分页传Pageable即可,自动代理了); ③更复杂的在ArticleRepositoryImpl中使用EntityManager

extends ArticleRepository: 目的是写其他复杂的sql

3.代码:

ArticleRepository和ArticleRepositoryImpl不用spring管理
/**
 *	extends JpaRepository: 目的是方便@Query直接写代码并自动封装,同时利用其集成的方法
 *	extends ArticleRepository: 目的是写其他复杂的sql
 */
@Component
public interface ArticleDao extends JpaRepository<Article,Integer>,ArticleRepository{
	/**
	 *  可以使用@Query的接口直接写在这里, 其他复杂的sql写在ArticleRepository实现类中
	 */
	@Query(value="select * from t_article", nativeQuery=true)
	List<Article> getAll();
}

  

public interface ArticleRepository {
	List<Article> getAll2();
	List<Article> getAll3();
}

  

public class ArticleRepositoryImpl implements ArticleRepository{
	@PersistenceContext
	private EntityManager em;
	
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	@Override
	public List<Article> getAll2() {
		List<Article> articles = null;
		List<Map> list = em.createNativeQuery("select id,title,create_time from t_article").unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).setFirstResult(0).setMaxResults(100).list();
		if(null!=list&&list.size()>0) {
			articles = new ArrayList<Article>();
			for(Map m :list){
				Article a = new Article();
				a.setId(Integer.parseInt(m.get("id").toString()));
				if(null!=m.get("title"))a.setTitle(m.get("title").toString());
				if(null!=m.get("create_time"))try {a.setCreateTime(sdf.parse(m.get("create_time").toString()));} catch (Exception e) {}
				articles.add(a);
			}
		}
		return articles;
	}
	
	@Override
	public List<Article> getAll3() {
		return em.createNativeQuery("select id,title,create_time as createTime from t_article").unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(Article.class)).setFirstResult(0).setMaxResults(100).list();
	}

}

  

 

posted @ 2020-09-12 03:03  trump2  阅读(148)  评论(0)    收藏  举报