我正在努力弄清楚如何调用我的命名查询...
@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
,还是在模型中引用?我似乎无法找到一个可靠的例子来帮助我看到全貌。
答案 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").
}