2015-08-28 71 views
0

我正在开发一个应用程序,使用spring启动与休眠。实际上,我之前创建了一个使用spring mvc进行休眠的项目,但现在我开始使用spring引导。所以问题是我无法使用我在spring mvc中使用的hql查询获取数据。因为我不知道在spring引导项目中写入hql查询的位置。在春季启动时运行hql查询时没有得到任何结果

我试图创造一个类,扩展春季启动DAO接口和实现我的方法,但没有得到正确的数据。

这是我以前的春季mvc代码。

我创建了一个实体类Rating.java和DAO类。这里是我的Rating.java

@Entity 
@Table(name = "rating") 
public class Rating { 


@GeneratedValue(strategy = GenerationType.AUTO) 
private long id; 

@Column(name="author_id") 
private long authId; 

@Id 
@Column(name="post_id") 
private long postId; 

@Column(name="rating_points") 
private long points; 


public Rating() { } 

public Rating(long id) { 
this.id = id; 
} 

public Rating(long authId, long postId, long points) { 
    this.authId = authId; 
    this.postId = postId; 
    this.points = points; 
} 
//Getters and setters 
} 

我的Spring MVC DAO

@SuppressWarnings("unchecked") 
public List<Rating> getRatingInfoById(long id) throws Exception { 
    session = sessionFactory.openSession(); 
    String queryString = "select r.id from Rating r where r.postId=:id group by points"; 
    Query query = session.createQuery(queryString); 
    query.setLong("id", id); 

    return query.list(); 
} 

我的春天启动代码。

DAO接口

@Transactional 
public interface MyDaoInterface extends CrudRepository<Rating, Long>{ 

public List<Rating> getRatingInfoById(long id) throws Exception; 

} 

DAO课堂,我实现了DAO接口方法

public class MyDao implements MyDaoInterface{ 


@Autowired 
SessionFactory sessionFactory; 

Session session = null; 
Transaction tx = null; 


@SuppressWarnings("unchecked") 
public List<Rating> getRatingInfoById(long id) throws Exception { 
    session = sessionFactory.openSession(); 
    String queryString = "select r.id from Rating r where r.postId=:id group by points"; 
    Query query = session.createQuery(queryString); 
    query.setLong("id", id); 

    return query.list(); 
} 

}

+0

打开调试日志的休眠,你正在尝试的任务,后调试日志。另外使用session = sessionFactory.getCurrentSessio();而不是openSession()。在您的MyDao类和您的控制器上显示注释,getRating的服务类。 –

回答

1

它看起来像您使用弹簧的数据(CrudRepository)等等查询应该在界面(MyDaoInterface)中定义。

我不知道该用的SessionFactory与Spring数据是一个好主意,它会更容易让你使用Spring的数据JPA(但仍与Hibernate的JPA IMPL)

你应该有一个配置类这样的(看http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.java-config):

@Configuration 
@EnableJpaRepositories 
@EnableTransactionManagement 
class ApplicationConfig { 

    @Bean 
    public DataSource dataSource() { 

    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); 
    return builder.setType(EmbeddedDatabaseType.HSQL).build(); 
    } 

    @Bean 
    public EntityManagerFactory entityManagerFactory() { 

    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
    vendorAdapter.setGenerateDdl(true); 

    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
    factory.setJpaVendorAdapter(vendorAdapter); 
    factory.setPackagesToScan("com.acme.domain"); 
    factory.setDataSource(dataSource()); 
    factory.afterPropertiesSet(); 

    return factory.getObject(); 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() { 

    JpaTransactionManager txManager = new JpaTransactionManager(); 
    txManager.setEntityManagerFactory(entityManagerFactory()); 
    return txManager; 
    } 
} 

而且你必须创建方法名称的查询,更多的解释在这里: http://docs.spring.io/spring-data/data-commons/docs/current/reference/html/#repositories.query-methods.query-creation

如果你不能从方法名这样做,你小号直到可以在你的方法界面上使用@Query

相反的extends CrudRepository可以extends JpaRepository(更多可用的泛型方法)

和公正的@Transactional一个字,这是更好地使用它的方法,在服务层定义(服务调用DAO层,例如如果其中一人负责创建一个用户和一个角色,如果它失败了,你想为用户提供回滚和创建的角色!)

+0

这个配置类有什么用? – artle

+0

我需要服务课程吗? – artle

+0

要定义一个EntityManagerFactory(JPA)而不是Hibernate SessionFactory并定义你的transactionManager(使@Transactional工作) –