java facade dao_java – 在Facade模式中放置用于创建namedQuer...
我正在為我的應(yīng)用程序使用GWT,Oracle數(shù)據(jù)庫(kù),Glassfish服務(wù)器,JPA.在客戶(hù)端沒(méi)有問(wèn)題.還在服務(wù)器端使用Facade模式.
AbstractFacade.java
public abstract class AbstractFacade {
private Class entityClass;
public AbstractFacade(Class 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 findAll() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
public List 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 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 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 findAll();
List findRange(int[] range);
int count();
}
Groups.java
@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 questionCollection;
@JoinColumn(name = "TEST_ID", referencedColumnName = "TEST_ID")
@ManyToOne
private Test atsTestId;
public Groups() {
}
//Getters and Setter here...
}
所以我在創(chuàng)建或查找db的所有記錄時(shí)沒(méi)有任何問(wèn)題.
public class ServiceImpl extends RemoteServiceServlet implements Service {
@EJB
AtsTestJautajumsGrupasFacadeLocal grupasEJB;
@Override
public List getCategories() {
List grupas = new ArrayList();
grupas = grupasEJB.findAll();
return grupas;
}
但現(xiàn)在我需要選擇具有相同Test_id的組.我創(chuàng)建了@NamedQuery(name =“Grous.findByTestId”……現(xiàn)在我有點(diǎn)迷失了.
所以我的問(wèn)題是:我如何使用NamedQuery?我在哪里創(chuàng)建一個(gè)訪(fǎng)問(wèn)db的方法.我需要從ServiceImpl訪(fǎng)問(wèn)該方法.這樣做的正確方法是什么?
編輯:
還有一個(gè)問(wèn)題.何時(shí)以及為什么我應(yīng)該使用CriteriaBuilder而不是你建議的?例:
public AtsTestJautajums getJautajums(Integer atsTestJautajumsId) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery q = cb.createQuery(AtsTestJautajums.class);
Root atsTestJautajums = q.from(AtsTestJautajums.class);
List predicateList = new ArrayList();
Predicate atsTestJautajumsIdPredicate;
if (atsTestJautajumsId != null) {
atsTestJautajumsIdPredicate = cb.equal(atsTestJautajums.get("atsTestJautajumsId"), atsTestJautajumsId);
predicateList.add(atsTestJautajumsIdPredicate);
}
Predicate[] predicates = new Predicate[predicateList.size()];
predicateList.toArray(predicates);
q.where(predicates);
TypedQuery query = em.createQuery(q);
return query.getSingleResult();
}
總結(jié)
以上是生活随笔為你收集整理的java facade dao_java – 在Facade模式中放置用于创建namedQuer...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 约瑟夫环java链表_java使用链表实
- 下一篇: flowable画图教程_flowabl