SpringBoot JPA 專題

  

Error:java

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2017-10-30 11:18:52.721 ERROR 16868 --- [main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jobDetailServiceImpl': Unsatisfied dependency expressed through field 'jobDetailRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobDetailRepository': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Method must not have Pageable *and* Sort parameter. Use sorting capabilities on Pageable instead! Offending method: public abstract org.springframework.data.domain.Page com.hujiang.career.bank.data.analysis.repository.JobDetailRepository.findAll(org.springframework.data.domain.Pageable,org.springframework.data.domain.Sort)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) ~[spring-context-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]
	at com.hujiang.career.bank.data.analysis.DataAnalysisApplication.main(DataAnalysisApplication.java:13) [classes/:na]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobDetailRepository': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Method must not have Pageable *and* Sort parameter. Use sorting capabilities on Pageable instead! Offending method: public abstract org.springframework.data.domain.Page com.hujiang.career.bank.data.analysis.repository.JobDetailRepository.findAll(org.springframework.data.domain.Pageable,org.springframework.data.domain.Sort)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	... 19 common frames omitted
Caused by: java.lang.IllegalStateException: Method must not have Pageable *and* Sort parameter. Use sorting capabilities on Pageable instead! Offending method: public abstract org.springframework.data.domain.Page com.hujiang.career.bank.data.analysis.repository.JobDetailRepository.findAll(org.springframework.data.domain.Pageable,org.springframework.data.domain.Sort)
	at org.springframework.data.repository.query.QueryMethod.<init>(QueryMethod.java:87) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
	at org.springframework.data.jpa.repository.query.JpaQueryMethod.<init>(JpaQueryMethod.java:89) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
	at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:77) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:436) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
	at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:221) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
	at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:277) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
	at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:263) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
	at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:101) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
	... 29 common frames omitted

 

解決辦法:
spring

    @GetMapping("/list")
    public Page<JobDetail> list(@PageableDefault(size = 5) Pageable pageable) {
        return jobDetailService.list(pageable);
    }

 

    @Autowired
    private JobDetailRepository jobDetailRepository;


    @Override
    public Page<JobDetail> list(Pageable pageable) {
        return jobDetailRepository.findAll(pageable,new Sort(Sort.Direction.DESC,"id"));
    }

 


改爲:數據庫

    @GetMapping("/list")
    public Page<JobDetail> list(@PageableDefault(size = 5, sort = "id", direction = Sort.Direction.DESC) Pageable pageable) {
        return jobDetailService.list(pageable);
    }

 

    @Autowired
    private JobDetailRepository jobDetailRepository;


    @Override
    public Page<JobDetail> list(Pageable pageable) {
        return jobDetailRepository.findAll(pageable);
    }

緣由:express

A Pageable already carries a Sort. Why would you want to hand in an additional one? The other point is, that the method can't have the same return type. 
A Pageable usually results in a Page returned, which doesn't work if only a Sort is given.
Yes, there's a case for returning a List or the like for both but I'd argue that giving up the constraints opens up a source for undetected misdeclarations. 
So I'd recommend to simply declare two query methods, one taking a Pageeable, one taking a Sort.

https://jira.spring.io/browse/DATAJPA-1138mvc

Pageable 是Spring Data庫中定義的一個接口,該接口是全部分頁相關信息的一個抽象,經過該接口,咱們能夠獲得和分頁相關全部信息(例如pageNumber、pageSize等)。
Pageable定義了不少方法,但其核心的信息只有兩個:一是分頁的信息(page、size),二是排序的信息。
在springmvc的請求中只須要在方法的參數中直接定義一個pageable類型的參數,當Spring發現這個參數時,Spring會自動的根據request的參數來組裝該pageable對象,
Spring支持的request參數以下:app

page,第幾頁,從0開始,默認爲第0頁  
size,每一頁的大小,默認爲20  
sort,排序相關的信息,以property,property(,ASC|DESC)的方式組織,例如sort=firstname&sort=lastname,desc表示在按firstname正序排列基礎上按lastname倒序排列。

這樣,咱們就能夠經過url的參數來進行多樣化、個性化的查詢。
Spring data提供了@PageableDefault幫助咱們個性化的設置pageable的默認配置。
例如@PageableDefault(value = 15, sort = { "id" }, direction = Sort.Direction.DESC)表示默認狀況下咱們按照id倒序排列,每一頁的大小爲15。dom

@ResponseBody  
@RequestMapping(value = "list", method=RequestMethod.GET)  
public Page<blog> listByPageable(@PageableDefault(value = 15, 
    sort = { "id" }, 
    direction = Sort.Direction.DESC)   
    Pageable pageable) {  
    return blogRepository.findAll(pageable);  
} 

http://blog.csdn.net/zsg88/article/details/66025560 ide

 

 

今天給你們介紹一下SpringBoot中JPA的一些經常使用操做,例如:增刪改查、分頁、排序、事務操做等功能。
下面先來介紹一下JPA中一些經常使用的查詢操做:spring-boot

    //And --- 等價於 SQL 中的 and 關鍵字,好比 findByHeightAndSex(int height,char sex);
    public List<User> findByHeightAndSex(int height,char sex);

   // Or --- 等價於 SQL 中的 or 關鍵字,好比 findByHeightOrSex(int height,char sex);
    public List<User> findByHeightOrSex(int height,char sex);

    //Between --- 等價於 SQL 中的 between 關鍵字,好比 findByHeightBetween(int min, int max);
    public List<User> findByHeightBetween(int min,int max);

    //LessThan --- 等價於 SQL 中的 "<",好比 findByHeightLessThan(int max);
    public List<User> findByHeightLessThan(int max);

    //GreaterThan --- 等價於 SQL 中的">",好比 findByHeightGreaterThan(int min);
    public List<User> findByHeightGreaterThan(int min);

    //IsNull --- 等價於 SQL 中的 "is null",好比 findByNameIsNull();
    public List<User> findByNameIsNull();

    //IsNotNull --- 等價於 SQL 中的 "is not null",好比 findByNameIsNotNull();
    public List<User> findByNameIsNotNull();

    //NotNull --- 與 IsNotNull 等價;
    public List<User> findByNameNotNull();

    //Like --- 等價於 SQL 中的 "like",好比 findByNameLike(String name);
    public List<User> findByNameLike(String name);

    //NotLike --- 等價於 SQL 中的 "not like",好比 findByNameNotLike(String name);
    public List<User> findByNameNotLike(String name);

    //OrderBy --- 等價於 SQL 中的 "order by",好比 findByNameNotNullOrderByHeightAsc();
    public List<User>findByNameNotNullOrderByHeightAsc();

    //Not --- 等價於 SQL 中的 "! =",好比 findByNameNot(String name);
    public List<User> findByNameNot(String name);

    //In --- 等價於 SQL 中的 "in",好比 findByNameIN(String name);
    public List<User> findByNameIn(String name);

    //NotIn --- 等價於 SQL 中的 "not in",好比 findByNameNotIN(String name);
    public List<User> findByNameNotIn(String name);

JPA中的風格就是這樣,每一個方法其實都是一條SQl命令,經過一些關鍵字就能夠實現SQL中相似於like in等等之類的命令了。post

 

最重要的是咱們再開發的過程當中,只須要編寫dao中一個個方法,不須要咱們編寫dao的實現類,這樣就能夠大大的挺高代碼的複用率、提升咱們的開發效率。

說道這裏難免會有人會問,那一些比較複雜的關聯查詢要怎麼實現呢,JPA的處理方法是:利用原生的SQl命令來實現那些複雜的關聯查詢,下面就來看下案例。

 //利用原生的SQL進行查詢操做
    @Query(value = "select o.* from orders o ,user u where o.uid=u.id and u.name=?1", nativeQuery = true)
    @Modifying
    public List<Order> findOrderByName(String name);

    //利用原生的SQL進行刪除操做
    @Query(value = "delete from orders where id=?1 ", nativeQuery = true)
    @Modifying
    public void deleteOrderById(int id);

    //利用原生的SQL進行刪除操做
    @Query(value = "delete from orders where uid=?1 ", nativeQuery = true)
    @Modifying
    public void deleteOrderByUId(int uid);

    //利用原生的SQL進行修改操做
    @Query(value = "update orders set name=?1 where id=?2 ", nativeQuery = true)
    @Modifying
    public void updateOrderName(String name,int id);

    //利用原生的SQL進行插入操做
    @Query(value = "insert into orders(name,uid) value(?1,?2)", nativeQuery = true)
    @Modifying
    public void insertOrder(String name,int uid);

上面的案例中給出了,利用JPA實現原生的SQL操做,能夠很方便的進行數據庫表的操做。
因此若是是那種查詢語句不是很是複雜,對查詢時間要求不是特別苛刻的項目,徹底能夠採用JPA來進行項目的開發。

下面接着來介紹JPA是怎麼實現分頁的效果,其實JPA脫胎於hibernate,因此自己就對分頁功能有很好的支持。下面給出具體例子:

    //實現分頁功能
    Page<User> findByNameNot(String name,Pageable pageable);
 @RequestMapping(value = "/params", method= RequestMethod.GET)
    @ResponseBody
    public String getEntryByParams(@RequestParam(value = "name", defaultValue = "林志強") String name, @RequestParam(value = "page", defaultValue = "0") Integer page, @RequestParam(value = "size", defaultValue = "15") Integer size) {
        Sort sort = new Sort(Sort.Direction.DESC, "id");
        Pageable pageable = new PageRequest(page, size, sort);
        Page<User> pages=userDao.findByNameNot(name,pageable);
        Iterator<User> it=pages.iterator();
        while(it.hasNext()){
            System.out.println("value:"+((User)it.next()).getId());
        }
        return "success...login....";
    }

上面的代碼一個是在dao層中的,一個是在controller中的。
dao層中添加一個返回值爲Page,參數值爲Pageable。controller層中經過實例化Pageable這個類,而後調用dao層這個分頁方法。

經過這些步驟就能夠輕輕鬆鬆的實現分頁的效果啦,看起來是否是特別方便。

最後在給你們介紹一下JPA是如何實現事務操做的。其實由於SpringBoot中已經對事務作了很好的封裝了,使用起來特別方便。下面看一下案例:

    @RequestMapping("/saveOrder")
    @ResponseBody
    @Transactional()
    public String saveOrder(){
        Order o1=new Order("11",2);
        Order o2=new Order("22",2);
        Order o3=new Order("33",2);
        Order o4=new Order("44",2);
        orderDao.save(o1);
        orderDao.save(o2);
        orderDao.save(o3);
        orderDao.save(o4);
        return "successfull....saveOrder......";
    }

只要在方法的上面加上@Transaction 這個註解就能夠輕輕鬆鬆的實現事務的操做了,是否是特別方便啊。
不過這裏有幾點須要注意的是:

1.這個註解實現的事務管理器是默認的,若是不想要默認是事務管理器,能夠本身進行添加,我這裏就很少介紹了。

2.事務的隔離級別也是能夠本身設置的,具體請看這篇博客 點擊打開連接

3.事務的傳播行爲也是能夠本身設置的,具體請看這篇博客點擊打開連接

到此到此關於JPA的一些常規方法就介紹完了,謝謝你們的閱讀。

http://blog.csdn.net/linzhiqiang0316/article/details/52639265

相關文章
相關標籤/搜索