java facade dao_java – 在Facade模式中放置用于创建namedQuer...

我正在为我的应用程序使用GWT,Oracle数据库,Glassfish服务器,JPA.在客户端没有问题.还在服务器端使用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...

}

所以我在创建或查找db的所有记录时没有任何问题.

public class ServiceImpl extends RemoteServiceServlet implements Service {

@EJB

AtsTestJautajumsGrupasFacadeLocal grupasEJB;

@Override

public List getCategories() {

List grupas = new ArrayList();

grupas = grupasEJB.findAll();

return grupas;

}

但现在我需要选择具有相同Test_id的组.我创建了@NamedQuery(name =“Grous.findByTestId”……现在我有点迷失了.

所以我的问题是:我如何使用NamedQuery?我在哪里创建一个访问db的方法.我需要从ServiceImpl访问该方法.这样做的正确方法是什么?

编辑:

还有一个问题.何时以及为什么我应该使用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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值