2012-01-03 19 views
0

我竭力要弄清楚如何調用我的命名查詢...如何叫我命名查詢在我看來

@NamedQueries({ 
    @NamedQuery(name = "Content.findAll", query = "SELECT c FROM Content c"), 
    @NamedQuery(name = "Content.findById", query = "SELECT c FROM Content c WHERE c.id = :id"), 
    @NamedQuery(name = "Content.findByUserId", query = "SELECT c FROM Content c WHERE c.userId = :userId")}) 
public class Content implements Serializable { 
... 

在我看來,我已經試過這樣一些變化,但似乎無法查明正確的用法。

<ol> <% 
    List<Content> contentList = model.Content.findAll(); 
    if (contentList != null) { 
     for (Content content : contentList) { %> 
      <li> <%= content %> </li> <% 
     } 
    } %> 
</ol> 

在谷歌我一直在尋找的結果,人們有使用,如:

List results = em.createNamedQuery("findAll").getResultList(); 

如果我有我的看法之內em的引用,或在此指的是模型中?我似乎無法找到一個可靠的例子來幫助我看到完整的畫面。

回答

1

您給出的示例看起來像它屬於Three-Tier Architecture服務層

也就是說,您將有一個ContentService其中公開方法如findAll()。然後你的ContentController會在適當的時候調用這個方法,並把得到的List<Content>放到模型中,然後視圖可以(最終!)使用。

以下是我會寫你的ContentService實施(假設ContentService接口已經被定義):

public class ContentServiceImpl implements ContentService { 

    @Autowired 
    private EntityManager em; // Gets wired in by Spring 

    public List<Content> findAllContent() { 
     return em.createNamedQuery("Content.findAll").getResultList(); 
    } 

    ... 
} 

我知道這好像很多工作相比,你已經嘗試了什麼(直接從視圖中訪問對象上的命名查詢),但這是對separation of concerns的重大違反,這是現在每個人都使用的MVC模式背後的主要思想。

想想如果你被告知,findAll應該實際上只能找到Content對象以新visible標誌設置true會發生什麼。用你目前的方法(如果它甚至可以),你必須改變你的視圖 - 當更改應該被隔離到一個更低的層。

現在想想上面的實現需要做些什麼。在Content對象上寫入新的@NamedQuery,然後在findAllContent()方法中調用。沒有其他變化。

+0

命名查詢存在於我的模型中。我也沒有使用Spring。你能否提供一個沒有Spring的例子?我實際上喜歡我的控制器調用'findAll'並將它傳遞給視圖,但我不確定如何在將請求分發到.jsp文件時執行此操作 – Webnet 2012-01-03 01:24:51

0

如果您不想使用Spring,則可以使用應用程序管理的EntityManager。也就是說,只需編寫POJO並像這樣創建一個EntityManager:

private EntityManagerFactory emf; 
private EntityManager em; 

public List findAll(){ 
    em.Persistence.createEntityManagerFactory("your-persistence-unit-name"); 
    return results = em.createNamedQuery("findAll"). 
} 
相關問題