Hallo!
In Anlehnung an dieses Thema
DAO und unter Verwendung der
brandaktuellen Hibernate Version
3.1alpha habe ich eine Frage bezüglich EJB3, EntityManager und der EJB-QueryLanguage.
Geht das eleganter und ohne Stringkonkatenation? Ich meine die
queryByProperty() Methode in der folgenden Klasse.
Code:
public abstract class AbstractDAO<E> {
protected final Class<E> entityClass;
protected final String entityClassName;
protected AbstractDAO(Class<E> entityClass) {
this.entityClass = entityClass;
this.entityClassName = entityClass.getName();
}
public E queryByProperty(String property, Object value) {
EntityManager manager = EjbManager.get();
Query query = manager.createQuery("select e from " + entityClassName + " e where e." + property + " = :value");
query.setParameter("value", value);
return (E) query.getSingleResult();
}
}
Ein konkreter Anwendungsfall sieht so aus:
Code:
public class UserDAO extends AbstractDAO<User> {
public UserDAO() {
super(User.class);
}
public static User forName(String name) {
return new UserDAO().queryByProperty("name", name);
}
}
Klar - man könnte den Querystring teilweise im Konstruktor zusammenbauen und in der Methode eine StringBuilder verwenden. Aber ich vermisse die Klarheit der Hibernate
Criteria Klasse. Hier ein Schnippsel, der natürlich nur mit einer Hibernate Session funktioniert und damit wieder nicht EJB3-generisch sondern Hibernate-abhängig ist:
Code:
Session session = ...
Criteria criteria = session.createCriteria(entityClass);
criteria.add(Property.forName("name").eq(name));
...
Oder bedingt die Designentscheidung für EJB3 dass man nicht mehr alle Extra-Hibernate-Features mehr nutzen kann? Gibt es einen Weg, der einem zumindest die Query-Geschichte
erleichtert?
Oder macht es gar keinen Sinn, solche Abfrage in typisierte DAOs unterzubringen?
Grüße und bis dann,
Christian