如何在我的视图中调用我的命名查询

时间:2012-01-03 00:23:11

标签: java java-ee-6

我正在努力弄清楚如何调用我的命名查询...

@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,还是在模型中引用?我似乎无法找到一个可靠的例子来帮助我看到全貌。

2 个答案:

答案 0 :(得分: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的对象,请考虑会发生什么。使用您当前的方法(如果它甚至可以工作),您必须更改视图 - 当更改应该被隔离到更低层时。

现在想一想上面的实现需要做些什么。在@NamedQuery对象上写一个新的Content,然后在findAllContent()方法中调用那个。没有别的变化。

答案 1 :(得分:0)

如果您不想使用Spring,可以使用Application managed EntityManager。也就是说,只需编写POJO并在其中创建一个EntityManager:

private EntityManagerFactory emf;
private EntityManager em;

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