だから、10年以上の休憩の後、Javaに戻り、JPAとJavaジェネリックを使用します。ジェネリックベースを作成しました。 findAll(other)
基本的に行うJPAクエリ
SELECT * FROM source WHERE other_id = other.id;
これは私がやっていることです。それは機能しますが、より良い、よりクリーンな方法があるかどうか疑問に思っています。 ManagedType
の使用は難しく、完全なドキュメントや簡単な例はあまりありません。
JPA2を使用するため、コードをできるだけ汎用的にする(しゃれを意図しない)ことにしました。
これは、すべてのエンティティクラスのルートです。私はおそらくそれを必要としませんが、それは私が基本的な間違いをするのを防ぎます。
import Java.io.Serializable;
public abstract class DomainObject implements Serializable {
private static final long serialVersionUID = 1L;
public abstract void setId(Long id);
public abstract Long getId();
}
これは抽象DAOクラスです。他のアクティビティをより具体的に行う必要があるため、これを実装クラスに拡張します。ほとんどの場合、遅延セットが確実にロードされるようにします。
public abstract class GenericDAOImpl<T extends DomainObject, T2 extends DomainObject> implements GenericDAO<T, T2> {
private Class<T> type;
@PersistenceContext
protected EntityManager entityManager;
public GenericDAOImpl(Class<T> type) {
super();
this.type = type;
}
... save and delete classes go here
@Override
public List<T> findAll(T2 where) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(type);
Root<T> rootQuery = criteriaQuery.from(type);
if (where != null) {
EntityType<T> entity = entityManager.getMetamodel().entity(type);
SingularAttribute<? super T, ?> attribute = null;
for (SingularAttribute<? super T, ?> singleAttribute: entity.getSingularAttributes()) {
// loop through all attributes that match this class
if (singleAttribute.getJavaType().equals(where.getClass())) {
// winner!
attribute = singleAttribute;
break;
}
}
// where t.object = object.getID()
criteriaQuery.where(criteriaBuilder.equal(rootQuery.get(attribute), where));
}
criteriaQuery.select(rootQuery);
TypedQuery<T> query = entityManager.createQuery(criteriaQuery);
// need this to make sure we have a clean list?
// entityManager.clear();
return query.getResultList();
}
助言がありますか?どちらかといえば、私は他の人がそれを利用できるようにそこにこれが欲しいです。
createQuery
でString
を使用したくなく、タイプセーフが必要な場合は、Adam Bienに助言してください。
@PersistenceContext EntityManager em; public List<ConfigurationEntry> allEntries() { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<ConfigurationEntry> cq = cb.createQuery(ConfigurationEntry.class); Root<ConfigurationEntry> rootEntry = cq.from(ConfigurationEntry.class); CriteriaQuery<ConfigurationEntry> all = cq.select(rootEntry); TypedQuery<ConfigurationEntry> allQuery = em.createQuery(all); return allQuery.getResultList(); }
http://www.adam-bien.com/roller/abien/entry/selecting_all_jpa_entities_as
このページはとても便利だと思いました
public abstract class GenericDAOWithJPA<T, ID extends Serializable> {
private Class<T> persistentClass;
//This you might want to get injected by the container
protected EntityManager entityManager;
@SuppressWarnings("unchecked")
public GenericDAOWithJPA() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
@SuppressWarnings("unchecked")
public List<T> findAll() {
return entityManager.createQuery("Select t from " + persistentClass.getSimpleName() + " t").getResultList();
}
}
すべてのエンティティに対してfindAllという名前のnamedQueryを使用し、entityManager.createNamedQuery(persistentClass.getSimpleName()+"findAll").getResultList(); }
`を使用して汎用FindAllで呼び出すこともできます。
これは機能し、whereステートメントが必要な場合は、パラメーターとして追加できます。
class GenericDAOWithJPA<T, ID extends Serializable> {
.......
public List<T> findAll() {
return entityManager.createQuery("Select t from " + persistentClass.getSimpleName() + " t").getResultList();
}
}