public interface CrudRepository
extends Repository {
T save(T entity);
T findOne(ID primaryKey);
Iterable findAll();
Long count();
void delete(T entity);
boolean exists(ID primaryKey);
// … more functionality omitted.
}
2、遵循JPA规范,同时也提供了灵活的数据访问方式;
Spring Data JPA能够很好的兼容目前JPA2.0规范,在定义Entity类的时候,可以在类中定义标准的@NamedQuery查询,也可以在Spring Data JPA的Repository类的方法中定义@Query查询。
标准的JPA对@NamedQuery定义如下:
@Entity
@NamedQuery(name="Country.findAll", query="SELECT c FROM Country c")
public class Country {
...
}
Spring Data JPA对@Query定义如下:
public interface CountryRepository extends JpaRepository {
@Query("SELECT c FROM Country c")
Country findAll();
}
通过以上定义,在Entity中即可省略掉@NamedQuery定义,让Entity类看起来更清爽。
3、通过方法名即可自动生成HQL语句;
如果你使用过Spring Data JPA,那么一定会对其提供的方法名自动转换为HQL感到十分有意思,这也是Spring Data JPA让人觉得很方便的地方,下面给两个转换规则的例子:
Keyword| Sample | JPQL snippet
And | findByLastnameAndFirstname|… where x.lastname = ?1 and x.firstname = ?2
Or | findByLastnameOrFirstname |… where x.lastname = ?1 or x.firstname = ?2
具体转换规则可参考官方文档。
4、通过接口自动注入实现类,实现非常简单。
我们只需要定义一个类似DAO的接口类,并继承Spring Data JPA提供的Repository接口类,一切就大功告成了,不需要编写任何一行代码,你的DAO接口类就具备了增删查改、分页、记录数统计等功能,对的,一切就那么简单!
以上是本人对Spring Data JPA使用上的一些感受,如果读者对其很感兴趣,可进一步阅读:
分享到:
2012-07-19 09:05
浏览 31578
评论
public List findAll(String username) {
List pageProducts = ulproductDao
.findAll(queryAllByMutiCondition(username));
return pageProducts;
}
private Specification queryAllByMutiCondition(
final String username) {
return new Specification() {
@Override
public Predicate toPredicate(Root p,
CriteriaQuery> q, CriteriaBuilder cb) {
//q = cb.createQuery(Ulproduct.class);
//p = q.from(Ulproduct.class);
q.multiselect(p.get("productsname"),
cb.sum(p. get("stocksnum")),
cb.sum(p. get("price")),
cb.sum(p. get("cost")));
q.where(cb.equal(p.get("username"),
StringUtils.trim(username)));
q.groupBy(p.get("productsname"));
q.getGroupRestriction();
return null;
}
};
}
红色部分根本没起作用,很诡异
我的代码是这样的,但是又问题
public List findAll(String username) {
List pageProducts = ulproductDao
.findAll(queryAllByMutiCondition(username));
return pageProducts;
}
private Specification queryAllByMutiCondition(
final String username) {
return new Specification() {
@Override
public Predicate toPredicate(Root p,
CriteriaQuery> q, CriteriaBuilder cb) {
//q = cb.createQuery(Ulproduct.class);
//p = q.from(Ulproduct.class);
q.multiselect(p.get("productsname"),
cb.sum(p. get("stocksnum")),
cb.sum(p. get("price")),
cb.sum(p. get("cost")));
q.where(cb.equal(p.get("username"),
StringUtils.trim(username)));
q.groupBy(p.get("productsname"));
q.getGroupRestriction();
return null;
}
};
}
动态的分组统计查询怎么实现呢?