`
TRAMP_ZZY
  • 浏览: 140227 次
社区版块
存档分类
最新评论

Spring Data JPA 实例

阅读更多
[url][/url]
1. Sping Data JPA 创建查找的顺序
a. CREATE attempts to construct a store-specific query from the query method name. The general approach is to remove a given set of well-known prefixes from the method name and parse the rest of the method. Read more about query construction in the section called “Query creation”.
b. USE_DECLARED_QUERY  tries to find a declared query and will throw an exception in case it can't find one. The query can be defined by an annotation somewhere or declared by other means. Consult the documentation of the specific store to find available options for that store. If the repository infrastructure does not find a declared query for the method at bootstrap time, it fails.
c. CREATE_IF_NOT_FOUND (default) combines CREATE and USE_DECLARED_QUERY. It looks up a declared query first, and if no declared query is found, it creates a custom method name-based query. This is the default lookup strategy and thus will be used if you do not configure anything explicitly. It allows quick query definition by method names but also custom-tuning of these queries by introducing declared queries as needed.

2. 查询创建机制
(1) 有用的前缀 find…By, read…By, query…By, count…By, and get…By,同时可以在查询语句前面加上 Distinct 来创建语句。
(2) 查询方法的创建







@Repository
public class UserDaoImpl implements UserDao {

	@PersistenceContext
	private EntityManager entityManager;
	
	@Override
	public User findByName(String name) {
		TypedQuery<User> query = this.entityManager.createQuery("select u from User u where u.name = :name",
				User.class);
		query.setParameter("name", name);
		return query.getSingleResult();
	}

	@Override
	public List<User> findAll() {
		TypedQuery<User> query = this.entityManager.createQuery("select u from User u", User.class);
		return query.getResultList();
	}

	@Override
	public void saveOrUpdate(User user) {
			this.entityManager.persist(user);
	}
}

@NoRepositoryBean
public interface AbstractRepository<T extends AbstractEntity> extends Repository<T, Long> {
	  @Query("select t from #{#entityName} t where t.id = ?1")
	  List<T> findAllById(Long id);
}

@MappedSuperclass
public class AbstractEntity {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	/**
	 * Returns the identifier of the entity.
	 * 
	 * @return the id
	 */
	public Long getId() {
		return id;
	}

	/* 
	 * (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {

		if (this == obj) {
			return true;
		}

		if (this.id == null || obj == null || !(this.getClass().equals(obj.getClass()))) {
			return false;
		}

		AbstractEntity that = (AbstractEntity) obj;

		return this.id.equals(that.getId());
	}

	/* 
	 * (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		return id == null ? 0 : id.hashCode();
	}
	
	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}
}

public interface UserRepository extends Repository<User, Integer>, UserRepositoryCustom {
	List<User> findByNameAndEmail(String name, String email);
	
	// Enable the distinct flag for the query
	List<User> findDistinctUserByNameOrEmail(String name, String email);
	List<User> findUserDistinctUserByNameOrEmail(String name, String email);
	
	//  Enabling ignoring case for an individual property
	List<User> findByNameIgnoreCase(String name);
	// Enabling static ORDER BY for a query
	List<User> findByNameAndEmailAllIgnoreCase(String name, String email);
	
	// Enabling static ORDER BY for a query
	@Lock(LockModeType.READ)
	List<User> findByNameOrderByUserIdAsc(String name);
	List<User> findByNameOrderByUserIdDesc(String name);
	
	
	Page<User> findByNameLike(String name, Pageable pageable);
	List<User> findByNameLike(String name, Sort sort);
	
	// User @Query
	@Query("select u from User u where u.email = ?1")
	User findByEmail(String email);
	@Query("select u from User u where u.name like %?1")
	List<User> findByNameEndsWith(String name);
	
	//User @Query to execute Navtie Query
	@Query(value = "select * from user where email = ?0", nativeQuery = true)
	User findByEmailAddress(String email);
	
	// Modify 
	@Modifying(clearAutomatically = true)
	@Query("update User u set u.name = ?1 where u.id = ?2")
	int setFixedNameFor(String name, Integer id);
}

/*
 * 选用CrudRepository 接口是为了暴露方法,因为默认的SimpleJpaRepository 已经实现了很多方法
 * 必须暴露出来,才能调用
 */
public interface ProductRepository extends CrudRepository<Product, Long>{
	
	public abstract Page<Product> findByDescriptionContaining(String description, Pageable pageable);
	
	@Query("select p from Product p where p.attributes[?1] = ?2")
	public abstract List<Product> findByArrtibuteAndValue(String attribute, String value);
	
	public abstract Long countByName(String name);
	
	public List<Product> findByName(String name);
	
}

public interface DocumentRepository extends JpaRepository<Document, Integer>, 
		CrudRepository<Document, Integer>{
	List<Document> findByDocName(String docName);
	
	@Query(value="select d from Document d where d.docType=:docType")
	public Document findByDocType(@Param("docType") Byte docType);
	
	public List<Document> findByUploadAuthorLike(String uploadAuthor);
	
	@Query("select d from Document d where d.author=:author")
	public List<Document> findByAuthorLike(String author);
	
	public List<Document> findByDocTypeBetween(Byte begin, Byte end);
	
}

@Repository
@Transactional(readOnly = true)
public class JpaCustomerDaoImpl implements CustomerDao {

	@PersistenceContext
	private EntityManager em;
	
	@Override
	@Transactional
	public Customer save(Customer customer) {
		if (customer.getId() != null) {
			em.persist(customer);
			return customer;
		} else {
			return em.merge(customer);
		}
	}

	@Override
	public Customer findByEmailAddress(EmailAddress emailAddress) {
		String sql = " select c from Customer c where c.emailAddress = :emailAddress";
		TypedQuery<Customer> query = em.createQuery(sql, Customer.class);
		query.setParameter("emailAddress", emailAddress);
		return query.getSingleResult();
	}

}

http://docs.spring.io/spring-data/jpa/docs/1.6.0.RELEASE/reference/html/index.html
  • 大小: 92 KB
  • 大小: 48.3 KB
分享到:
评论

相关推荐

    spring data jpa 实例源码

    spring data jpa 实例源码 spring data jpa 实例源码 spring data jpa 实例源码

    SpringDataJPA实例

    在这个实例中,我们将会深入理解SpringDataJPA如何与SpringBoot结合,实现数据库的增删改查(CRUD)操作以及实体之间的关联关系处理。 首先,SpringBoot是Spring框架的轻量级启动器,它自动配置了大量常见应用的...

    Spring Data JPA从入门到精通

    'SpringDataJPA从入门到精通'分为12章 内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观...

    手动创建 SpringMvc +SpringDataJpa+Hibernate+ freemarker mavenProject+ 环境切换 webDemo

    在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...

    spring data jpa入门实例

    【Spring Data JPA 入门实例】 Spring Data JPA 是 Spring 框架的一个模块,它简化了数据库访问层(DAO)的开发,通过提供自动化的 Repository 实现,使得开发者无需编写大量的 CRUD(创建、读取、更新、删除)代码...

    SpringData JPA 参考文档PDF 英文

    Spring Data JPA是Spring框架的一部分,主要简化了数据访问层(Repository层)的代码开发,它提供了一种简便的方式来实现数据访问层的接口。Spring Data JPA 1.4.2版本的官方参考文档详细介绍了如何使用Spring Data ...

    spring Data JPA框架实例

    在这个实例中,我们将深入探讨如何利用Spring Data JPA进行基本的CRUD(创建、读取、更新、删除)操作,登录验证,以及分页查询。 首先,我们需要在项目中引入Spring Data JPA的相关依赖,这通常在Maven或Gradle的...

    Spring Data JPA

    这个入门项目实例旨在帮助开发者快速掌握Spring Data JPA的基本用法和核心概念,通过实际案例进行学习和交流。 在Spring Data JPA中,你可以避免大量编写SQL语句和手动管理实体对象的状态,因为Spring Data JPA为你...

    Spring Data JPA1.7中文文档

    Spring Data JPA 是一个强大的框架,它简化了与Java Persistence API (JPA)的交互,提供了对数据库操作的便捷抽象。1.7.0.RELEASE 版本的文档由 Oliver Gierke、Thomas Darimont 和 Christoph Strobl 编写,并由 ...

    spring data jpa 入门例子

    Spring Data JPA是Spring框架的一个模块,用于简化Java Persistence API(JPA)的使用,它提供了数据访问的抽象层,让开发者能够以更简洁的方式与数据库进行交互。本入门例子将帮助你理解并掌握Spring Data JPA的...

    Spring+Spring MVC+SpringData JPA整合完成增删改查,翻页实例.zip

    在这个"Spring+Spring MVC+SpringData JPA整合完成增删改查,翻页实例"中,我们将深入探讨这三个组件如何协同工作,实现高效的数据管理与用户交互。 首先,Spring MVC是Spring框架的一个模块,专门用于构建Web应用...

    2017 spring data jpa+spring4.2+springmvc+hibernate4.3 maven环境intellij idea增删改查实例

    在本项目中,我们探索的是一个基于2017年技术栈的Java Web应用程序实例,主要涉及Spring Data JPA、Spring 4.2、Spring MVC和Hibernate 4.3。这些技术是Java开发中的核心组件,尤其在企业级应用开发中广泛使用。下面...

    spring data jpa 的Specifications动态查询

    首先,我们需要导入`org.springframework.data.jpa.domain.Specifications`包,并创建一个`Specification`实例。例如,如果我们有一个`User`实体类,我们想根据用户名进行查询,可以这样做: ```java public class ...

    Spring Data JPA 简化 JPA 开发

    Spring Data JPA 是一个由 Spring 框架提供的强大库,它极大地简化了基于 Java Persistence API (JPA) 的数据库访问。JPA 是 Java 平台上的标准 ORM(对象关系映射)规范,允许开发者使用面向对象的方式处理数据库...

    springData-jpa-demo

    本项目“springData-jpa-demo”旨在提供一个示例,帮助开发者理解如何在实践中应用Spring Data JPA。 首先,Spring Data JPA 是Spring框架的一部分,它为ORM(对象关系映射)工具如Hibernate提供了高级抽象层。通过...

    springdatajpa 包括jar包

    在Spring Data JPA中,Spring负责管理Repository实例,通过@Autowired注解,我们可以自动将Repository注入到需要的地方,无需手动创建。同时,Spring的事务管理也与Spring Data JPA紧密结合,通过@Transactional注解...

    Spring-data-jpa常用教程.pdf

    ### Spring-data-jpa 的核心知识点解析 #### 一、Spring-data-jpa 基本介绍 Spring-data-jpa 是 Spring 家族中的一个重要成员,它主要用于简化基于 Java Persistence API (JPA) 的数据访问层(DAO)的开发工作。...

    spring data jpa demo

    5. **启动服务**:Spring Boot 应用启动后,Spring Data JPA 会自动扫描并创建 Repository 实例。 【查询方法的创建】 1. **自动查询方法**:Spring Data JPA 可以根据方法名自动解析生成对应的 SQL。例如,`...

    SpringDataJpa整合FreeMarker源码样例

    《SpringDataJpa整合FreeMarker源码解析》 在当今的软件开发中,Spring Boot、Spring Data JPA和FreeMarker的整合已经成为了构建高效、简洁Web应用的常见选择。本篇将深入探讨如何将这三个强大的工具结合在一起,...

Global site tag (gtag.js) - Google Analytics