GWT, Oracle db, Glassfish 서버, JPA를 사용하고 있습니다. 클라이언트 측에서 아무런 문제가 없습니다. 또한 서버 측에서 Facade 패턴을 사용합니다.Facade 패턴에서 namedQuery를 작성하는 코드는 어디에 두어야합니까?
AbstractFacade.java
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public void create(T entity) {
getEntityManager().persist(entity);
}
public void edit(T entity) {
getEntityManager().merge(entity);
}
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
public List<T> findAll() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
public List<T> findRange(int[] range) {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
javax.persistence.Query q = getEntityManager().createQuery(cq);
q.setMaxResults(range[1] - range[0] + 1);
q.setFirstResult(range[0]);
return q.getResultList();
}
public int count() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
cq.select(getEntityManager().getCriteriaBuilder().count(rt));
javax.persistence.Query q = getEntityManager().createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
}
GroupFacade.java
@Stateless
public class GroupsFacade extends AbstractFacade<Groups> implements GroupsFacadeLocal {
@PersistenceContext(unitName = "exam_ejb_1.0PU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public GroupsFacade() {
super(Groups.class);
}
}
GroupsFacadeLocal.java
@Local
public interface GroupsFacadeLocal {
void create(Groups groups);
void edit(Groups groups);
void remove(Groups groups);
Groups find(Object id);
List<Groups> findAll();
List<Groups> findRange(int[] range);
int count();
}
Groups.java
그래서 db를 만들거나 모든 레코드를 찾는 데 아무런 문제가 없었습니다.
public class ServiceImpl extends RemoteServiceServlet implements Service {
@EJB
AtsTestJautajumsGrupasFacadeLocal grupasEJB;
@Override
public List<Groups> getCategories() {
List<Groups> grupas = new ArrayList<Groups>();
grupas = grupasEJB.findAll();
return grupas;
}
하지만 이제는 동일한 Test_id
의 그룹을 선택해야합니다. @NamedQuery(name = "Grous.findByTestId"...
을 만들었으며 지금은 조금 잃어 버렸습니다.
내 질문은 : 어떻게 그 NamedQuery를 사용합니까? db에 액세스하는 메소드는 어디서 만들 수 있습니까? ServiceImpl에서 해당 메소드에 액세스해야한다. 이것을하는 올바른 방법은 무엇입니까?
EDITED : 하나 더 질문드립니다. 언제 그리고 왜 당신이 제안한 것 대신에 CriteriaBuilder를 사용해야합니까? 예 :
감사합니다. 모든 것이 이제 내가 원하는대로 작동합니다. 실제로 그것은 쉬웠다, 아마 나는 어제 너무 피곤했다. – Belamors
질문이 하나 더 있습니다. 언제 그리고 왜 당신이 제안한 것 대신에 CriteriaBuilder를 사용해야합니까? – Belamors
미안하지만 CriteriaBuilder에 대해 염두에 두지는 않습니다 ...하지만이 방법은 다른 방법 일뿐입니다. – RadASM