2017-10-14 92 views
0

我想在SpringBoot中創建一個本機查詢返回到DTO。 但是,我的SessionFactory返回null。 我在這裏看過很多問題,但似乎沒有人幫忙。Spring引導SessionFactory返回空指針

我在這裏做錯了什麼?

application.properties

spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext 

SessionFactoryConfig.class

import org.hibernate.SessionFactory; 
import org.hibernate.jpa.HibernateEntityManagerFactory; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class SessionFactoryConfig { 

    @Bean 
    public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf) { 
     return hemf.getSessionFactory(); 
    } 
} 

ReportAverageCost.class

import lombok.*; 
import org.hibernate.SQLQuery; 
import org.hibernate.SessionFactory; 
import org.hibernate.transform.ResultTransformer; 
import org.hibernate.transform.Transformers; 
import org.springframework.beans.factory.annotation.Autowired; 

import java.util.Date; 
import java.util.List; 

@Getter 
@Setter 
@AllArgsConstructor 
@NoArgsConstructor 
@Builder 
public class ReportAverageCost { 

    @Autowired 
    private SessionFactory sessionFactory; 

    public Date date; 

    public List getReportAverageCost() throws Exception { 
     String q = "SELECT (...)"; 

     SQLQuery query = sessionFactory.getCurrentSession().createSQLQuery(q); 
     query.addScalar("date"); 
     ResultTransformer aliasToBean = Transformers.aliasToBean(ReportAverageCost.class); 
     List result = query.setResultTransformer(aliasToBean).list(); 
     return result; 
    } 
} 

回答

1

在您的ReportAverageCost類上定義註釋@Component

+0

感謝@Sagar但它沒有工作。我找到了另一個解決方案併發布爲答案 –

0

這個網站幫助了我:https://blog.pranavek.com/using-hibernate-sessionfactory-in-spring-boot-app/

所以我的代碼有這樣的:

application.properties

spring.jpa.properties.hibernate.current_session_context_class=thread 

ReportAverageCostRepository.class

@Repository 
public class ReportAverageCostRepository { 

    @Autowired 
    private SessionFactory sessionFactory; 

    public List getReportAverageCost() throws Exception { 
     String q = "SELECT (...)"; 

     Session session = this.sessionFactory.getCurrentSession(); 
     session.beginTransaction(); 

     SQLQuery query = session.createSQLQuery(q); 
     query.addScalar("date"); 
     query.addScalar("transactionIdentifier"); 
     query.addScalar("amount"); 
     query.addScalar("cost"); 
     query.addScalar("price"); 

     ResultTransformer aliasToBean = Transformers.aliasToBean(ReportAverageCost.class); 
     List result = query.setResultTransformer(aliasToBean).list(); 

     session.getTransaction().commit(); 

     return result; 
    } 

} 

ReportAverageCostController.class

@RestController 
@RequestMapping(value = "/api/v1/reports/averageCost") 
public class ReportAverageCostController { 

    @Autowired 
    ReportAverageCostRepository reportAverageCostRepository; 

    @RequestMapping(value = "/{pair}", method = RequestMethod.GET) 
    public List<ReportAverageCost> reportAverageCost() throws Exception { 
     return reportAverageCostRepository.getReportAverageCost(); 
    } 
}