抽象抽象JPA DAO中的命名查询 [英] Abstracting named queries in an abstract JPA DAO

查看:199
本文介绍了抽象抽象JPA DAO中的命名查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个抽象DAO类,它使用参数化类型 E (实体)和 K (主键)。在每个实体中,我都有一个 @NamedQuery 。我想动态调用这个命名查询,而不知道它的确切名称和参数名称。



例如,假设下面的实体 City
$ p $ @Entity(name =CITY)
@NamedQuery(
name = findCityByname,
query =FROM CITY c WHERE name =:CityName

public class City {
// ...
}

CityDao

  public class CityDao extends AbstractDao< City,Long> {
public CityDao(){
super(City.class);


$ / code $ / pre

我应该如何实现 findByName()方法位于 AbstractDao 中,这样我就不需要知道确切的名称和参数名称了吗?

  public abstract class AbstractDao< E,K>实现Dao< E,K> {

@PersistenceContext
受保护的EntityManager entityManager;
protected Class< E> entityClass;

protected AbstractDao(Class< E> entityClass){
this.entityClass = entityClass;

$ b @Override
public E findByName(String name){
try {
return(E)entityManager
.createNamedQuery( findCityByName)
.setParameter(CityName,name)
.getSingleResult();
} catch(Exception e){
return null;
}
}

// ...
}


命名查询的命名约定通常是< Entity Name> .findBy< PropertyAndAnotherProperty> , City.findByName,所以我会尝试更改命名查询以遵循此模式。此查询的参数应该也具有相同的名称,或者可以使用位置参数。然后你的find方法会变成

  @Override 
public E findByName(String name){
E entity = null;
try {
return(E)entityManager.createNamedQuery(myClass.getSimpleName()+.findByName)
.setParameter(name,name)
.getSingleResult() ;
} catch(Exception ex){
return null;
}
}


I have an abstract DAO class which uses parameterized types E (Entity) and K (Primary Key). In every entity I have a @NamedQuery. I want to dynamically invoke this named query without knowing its exact name and parameter name.

As an example, imagine the following entity City

@Entity(name="CITY")
@NamedQuery(
    name="findCityByname",
    query="FROM CITY c WHERE name = :CityName"
)
public class City { 
    // ...
}

and this CityDao

public class CityDao extends AbstractDao<City, Long> {
    public CityDao() {
        super(City.class);
    }   
}

How should I implement the findByName() method in AbstractDao so that I don't need to know the exact name and parameter name?

public abstract class AbstractDao<E, K> implements Dao<E, K> {

    @PersistenceContext
    protected EntityManager entityManager;
    protected Class<E> entityClass;

    protected AbstractDao(Class<E> entityClass) {
        this.entityClass = entityClass; 
    }

    @Override
    public E findByName(String name) {
        try {
            return (E) entityManager
                .createNamedQuery("findCityByName")
                .setParameter("CityName", name)
                .getSingleResult();
        } catch(Exception e) {
            return null;
        }
    }

    // ...
}

解决方案

The naming convention for named queries is usually <Entity Name>.findBy<PropertyAndAnotherProperty>, "City.findByName" in your example, so I would try to change the named queries to follow this pattern. The parameter to this query should then also have the same name, or you could use positional parameters. Your find method would then turn into

@Override
public E findByName(String name) {
    E entity = null;
    try {
        return (E)entityManager.createNamedQuery(myClass.getSimpleName() + ".findByName")
                               .setParameter("name", name)
                               .getSingleResult();
    } catch (Exception ex) {
        return null;
    }
}

这篇关于抽象抽象JPA DAO中的命名查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆