【问题标题】:Spring Boot SessionFactory returning NullPointerSpring Boot SessionFactory 返回 NullPointer
【发布时间】:2017-10-14 17:58:10
【问题描述】:

我正在尝试将 SpringBoot 中的本机查询返回到 DTO。 但是,我的 SessionFactory 正在返回 null。 我在 SO 中阅读了很多问题,但似乎没有人提供帮助。

我在这里做错了什么?

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;
    }
}

【问题讨论】:

    标签: java spring hibernate spring-boot


    【解决方案1】:

    ReportAverageCost 类上定义注释 @Component

    【讨论】:

    • 感谢@Sagar,但它没有用。我找到了另一个解决方案并发布为答案
    【解决方案2】:

    这个网站帮助了我: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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 2018-03-22
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      相关资源
      最近更新 更多