Java 在Facade模式中,在何处放置创建namedQuery的代码?
我在应用程序中使用GWT、Oracle db、Glassfish服务器和JPA。客户端没有问题。在服务器端也使用Facade模式 AbstractFacade.javaJava 在Facade模式中,在何处放置创建namedQuery的代码?,java,gwt,jpa,ejb,facade,Java,Gwt,Jpa,Ejb,Facade,我在应用程序中使用GWT、Oracle db、Glassfish服务器和JPA。客户端没有问题。在服务器端也使用Facade模式 AbstractFacade.java public abstract class AbstractFacade<T> { private Class<T> entityClass; public AbstractFacade(Class<T> entityClass) { this.entityClass = entit
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();
}
我不知道您的项目是如何工作的,以及您是如何编写代码的,但基本上我认为下面的示例包含了您需要执行的所有内容
public List<Groups> getCategoriesByTestId(Test test){
return em().createNamedQuery("Grous.findByTestId", Groups .class).setParameter("TestId", test.getId()).getResultList();
}
public List getCategoriesByTestId(测试){
返回em().createNamedQuery(“Grous.findByTestId”,Groups.class).setParameter(“TestId”,test.getId()).getResultList();
}
您的方法应该在您使用的任何服务中被调用(代码中似乎是ServiceImpl),并在DAO中实现您的方法,该DAO使用jpa处理所有数据库访问(代码中似乎是GroupsFacade)。不要忘记在GroupsFacadolocal中声明您的方法原型。如果我能很好地理解您的代码,我想就是这样。谢谢!现在一切都按照我的要求进行。其实很简单,可能是我昨天太累了。还有一个问题。什么时候以及为什么我应该使用CriteriaBuilder而不是你建议的?很抱歉,我对CriteriaBuilder没有任何想法。。。但我认为这只是另一种方式。。。
@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();
}
@Entity
@Table(name = "GROUPS")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Groups.findAll", query = "SELECT a FROM AtsTestJautajumsGrupas a"),
@NamedQuery(name = "Grous.findByTestId", query = "SELECT a FROM Groups a WHERE a.TestId = :TestId")})
public class Groups implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "GROUP_ID")
private BigDecimal groupId;
@Size(max = 200)
@Column(name = "name")
private String name;
@Column(name = "ARCHIVE_STAT")
private String archiveStat;
@OneToMany(mappedBy = "GroupId")
private Collection<Question> questionCollection;
@JoinColumn(name = "TEST_ID", referencedColumnName = "TEST_ID")
@ManyToOne
private Test atsTestId;
public Groups() {
}
//Getters and Setter here...
}
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;
}
public AtsTestJautajums getJautajums(Integer atsTestJautajumsId) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<AtsTestJautajums> q = cb.createQuery(AtsTestJautajums.class);
Root<AtsTestJautajums> atsTestJautajums = q.from(AtsTestJautajums.class);
List<Predicate> predicateList = new ArrayList<Predicate>();
Predicate atsTestJautajumsIdPredicate;
if (atsTestJautajumsId != null) {
atsTestJautajumsIdPredicate = cb.equal(atsTestJautajums.<String>get("atsTestJautajumsId"), atsTestJautajumsId);
predicateList.add(atsTestJautajumsIdPredicate);
}
Predicate[] predicates = new Predicate[predicateList.size()];
predicateList.toArray(predicates);
q.where(predicates);
TypedQuery<AtsTestJautajums> query = em.createQuery(q);
return query.getSingleResult();
}
public List<Groups> getCategoriesByTestId(Test test){
return em().createNamedQuery("Grous.findByTestId", Groups .class).setParameter("TestId", test.getId()).getResultList();
}