Как назвать мой именованный запрос на мой взгляд - PullRequest
0 голосов
/ 03 января 2012

Я пытаюсь понять, как вызвать мой именованный запрос ...

@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>

В Google я продолжаю находить результаты, где люди используют как:

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

Должен ли я иметь ссылку на em в моем представлении, или это относится к модели? Кажется, я не могу найти надежный пример, чтобы помочь мне увидеть полную картину.

Ответы [ 2 ]

1 голос
/ 03 января 2012

Пример, который вы привели, выглядит так, как будто он относится к уровню обслуживания трехуровневой архитектуры .

То есть у вас будет 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();
    }

    ...
}

Я знаю, что это похоже на большую работу по сравнению с тем, что вы пытались (прямой доступ к именованному запросу "на" объекте из представления), но это довольно серьезное нарушение разделения проблем , которая является основной идеей шаблона MVC , который каждый сегодня использует.

Подумайте о том, что произойдет, если вам скажут, что findAll должен на самом деле найти только 1027 * объектов с новым установленным флагом visible true. При вашем текущем подходе (если он даже работал) вам придется изменить представление - когда изменение должно быть выделено на гораздо более низкий уровень.

Теперь подумайте о том, что нужно сделать с помощью описанной выше реализации. Напишите новый @NamedQuery для вашего Content объекта, а затем вызовите , что в методе findAllContent(). Больше ничего не меняется.

0 голосов
/ 11 января 2012

Вы можете использовать управляемый приложением EntityManager, если не хотите использовать Spring.То есть просто напишите POJO и создайте там EntityManager следующим образом:

private EntityManagerFactory emf;
private EntityManager em;

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