在Facade模式中将用于创建namedQuery的代码放在哪里?

Belamors

我正在为我的应用程序使用GWT,Oracle数据库,Glassfish服务器,JPA。客户端没有问题。在服务器端也使用Facade模式。

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

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

但是现在我需要选择相同的组Test_id我创建了@NamedQuery(name = "Grous.findByTestId"...,现在有点迷路了。

所以我的问题是:如何使用该NamedQuery?我在哪里制作访问db的方法。我需要从ServiceImpl访问该方法。什么是正确的方法来做到这一点?

编辑:另一个问题。什么时候以及为什么我应该使用CriteriaBuilder而不是您的建议?例子:

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();
    }
RadASM

我不确切知道您的项目的工作方式以及代码的工作方式,但是基本上我认为以下示例包含执行此操作所需的一切。

public List<Groups> getCategoriesByTestId(Test test){
   return em().createNamedQuery("Grous.findByTestId", Groups .class).setParameter("TestId", test.getId()).getResultList();
}

而且,应该在您使用的任何服务中调用您的方法(在您的代码中似乎是ServiceImpl),并在DAO中实现您的方法,该DAO使用jpa处理所有数据库访问(在您的代码中似乎是GroupsFacade)。不要忘记在GroupsFacadeLocal中声明您的方法原型。如果我能很好地理解您的代码,我想就是这样。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 Laravel 5.6 中将用于格式化 DB 内容的代码放在哪里

在VIPER中将UIView动画代码放在哪里?

我应该把模型创建代码放在哪里?

Django启动代码放在哪里?

欢迎活动代码放在哪里

在Elixir / Mix / Phoenix应用程序中将服务/初始化代码放在哪里?

Android:将活动的onCreate()代码放在哪里?

我的chrome扩展程序的主要代码放在哪里?

我应该将我的测试代码放在哪里?

我应该把源代码放在哪里?

UITabBarControllerDelegate-将代码放在哪里?

CommonJs:初始化代码放在哪里?

上传文件时我把 Spinner 代码放在哪里?

我应该在Swaggerize-Restify项目中将用于公共端点的算法放在哪里?

从源代码编译的应用程序的源代码放在哪里?

将代码放在哪里,以便在我的服务启动后执行代码?

在哪里将日志记录设置代码放在flask应用程序中?

使用Rails 6,您将“特定于页面的” JavaScript代码放在哪里?

使用Rails 3.1,您将“页面特定的” JavaScript代码放在哪里?

我应该将Meteor.startup中使用的函数的代码放在哪里?

从HttpContext获取Razor Pages中的用户名:将代码放在哪里

在果园的小部件或插件中,将我的自定义UserRankingActivity代码放在哪里?

我应该把React组件的初始化代码放在哪里?

我应该在哪里将代码放在ActionBar.TabListener中

我应该在哪里将代码放在C#服务中

在使用 Packer 的食谱中,是否有关于将 Chef 代码放在哪里的约定?

我应将此代码放在哪里安装Absynth 5?

MVVM-模型与ViewModel-将代码放在哪里?

我在哪里将自定义代码放在Laravel中