2013-10-10 42 views
1

我有一個pojo包含幾個命名查詢來獲取數據。春季休息服務 - hibernate dao - 註釋 - pojo - namedqueries

@NamedQueries({ 
    @NamedQuery(name="abc", query="test") 
}) 
@Entity 
@Table(name = "MY_TABLE") 
public class MyTable implements java.io.Serializable{ 
    private long id; 
    private String name; 
    ........... 

我必須從服務層方法中訪問此命名查詢的結果。 所以我試圖將hibernate會話工廠自動裝入服務層類。

@Service 
public class MyServiceClass{ 
    @Autowired 
    SessionFactory sessionFactory; 
    .......... 
    public void myMethod() { 
     Session session = acceSessionFactory.getCurrentSession(); 
     Query query = session.getNamedQuery("abc").setInteger("id", 1).setString("name", "testname"); 
     MyTable mytablerow = (MyTable) query.uniqueResult(); 
      ....... 
    } 

但是,在上面的方法 - 我認爲我們有服務層的dao層邏輯。 這是訪問指定查詢的正確方法嗎?

注意:我沒有上面的MyTable類的DAO接口或類。

回答

0

在你接近你實際上沒有DAO層。
與DAO服務層常用的方法將是

@NamedQueries({ 
    @NamedQuery(name="abc", query="test") 
}) 
@Entity 
@Table(name = "MY_TABLE") 
public class MyTable 


@Repository 
public class MyTableDAOImpl implements MyTableDAO 

    @Autowire 
    protected SessionFactory sessionFactory; 
    public MyTable myMethod1() { 
     Query query = session.getNamedQuery("abc") 
     .setInteger("id",1).setString("name", "testname"); 
     return (MyTable) query.uniqueResult();} 

    public MyTable myMethod2() { ...} 


@Service 
public class MyTableServiceImpl implements MyTableService 
    @Autowire 
    protected MyTableDAO myTableDAO; 


    public MyTable myMethodService() { 
     //Some logic 
     ... 
     return myTableDAO.myMethod1() 

    } 

具有命名查詢的目的是,他們被編譯並在驗證應用程序啓動時間 請參閱Advantages of Named queries in hibernate?

我建議你考慮GenericDAO pattern

+0

這種組合方法如何?擁有GenericDAO?有一個接口IMyTableDAO,它實現GenericDAO - 但沒有任何MyTableDAOImpl。 – user811433

+0

@ user811433查看'spring-data-jpa',這正是你描述的原因。 – Kartoch

+0

您將需要MyTableDAOImpl NamedQuery(「abc」)通常特定於您的實體或某個基本實體。它不會被引用GenericDAOImpl –

0

是的,你的服務類中有DAO層邏輯。更好的設計將是有一個MyTableDao接口,該接口公開可用於從MyTable檢索數據的各種方法。

+0

如果我添加一個MyTableDao界面,是不是會被擊敗具有namedqueries的目的是什麼? – user811433

+0

根據設計,您應該在您的界面中爲您的命名查詢公開一個方法。此方法將使用namedQuery並檢索結果並相應發送。對於單個命名查詢,您的方法將正常工作。但是如果你有多個命名查詢,並且在一個地方調用命名查詢的所有方法,將會有所幫助。此外,可能會出現以下情況,您希望過濾出您在指定查詢中收到的某些數據,並且dao類將會是理想的地方,以便實現可讀性目的 –