2015-08-28 44 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工作) –