1、FetchType.LAZY
:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。
2、FetchType.EAGER
:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。
3、比方User
类有两个属性,name
跟address
,就像百度知道,登录后用户名是需要显示出来的,此属性用到的几率极大,要马上到数据库查,用急加载;而用户地址大多数情况下不需要显示出来,只有在查看用户资料是才需要显示,需要用了才查数据库,用懒加载就好了。所以,并不是一登录就把用户的所有资料都加载到对象中,于是有了这两种加载模式。
5.3.9. Applying query hints
它需要一个JPA @QueryHint
注释数组和一个布尔标志来潜在地禁用应用于在应用分页时触发的附加计数查询的提示
public interface PersonRepository extends Repository<User, Long> {
List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
// Enables the distinct flag for the query
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
// 为单个属性忽略所有的大小写
List<Person> findByLastnameIgnoreCase(String lastname);
// 为所有的属性忽略大小写
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
// Enabling static ORDER BY for a query
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}
Spring数据库抽象中的中央界面是Repository
(可能不是什么惊喜)。管理域类以及域类的id类型作为类型参数
在CrudRepository
之上,有一个PagingAndSortingRepository
抽象,可以添加其他方法来简化对实体的分页访问
Example 4. PagingAndSortingRepository
public interface PagingAndSortingRepository<T, ID extends Serializable>
extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
}
Accessing the second page of User
by a page size of 20 you could simply do something like this:
PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(new PageRequest(1, 20));
In addition to query methods, query derivation for both count and delete queries, is available.
Spring Data JPA 1.11新特性
Projections:
- 实体可以一次性定义多个属性:
Private String firstName, lastName;
- 如果想隐藏某个字段不查:定义
interface NoAddresses {
String getFirstName();
String getLastName();
}
使用
interface PersonRepository extends CrudRepository<Person, Long> {
NoAddresses findByFirstName(String firstName);
}
重命名某个属性
interface FullNameAndCountry {
@Value("#{target.firstName} #{target.lastName}") //指定属性来源
String getFullName();
@Value("#{target.address.country}")
String getCountry();
}
interface RenamedProperty {
String getFirstName();
@Value("#{target.lastName}")//指定属性来源
String getName(); }
评论