Hallo,
ich möchte gerade gerade ein Projekt aufbauen, welches ich in andere Projekte vererben kann, sodass ich einzelne Codeteile nicht immer neu implementieren muss.
Hierzu gehören auch meine Datenbankabfragen.
Ich habe bspw. eine UserService - Klasse, in der ich nun so Dinge mache wie:
public UserInterface findUserByEmail(String email);
Ich habe mir hierzu bereits eine Util Klasse (JpaQueryUtil) gebaut, mit der ich meine Abfragen erstelle, welche für jegliche Klassen gilt...
Hier gehe ich dann in die Methode immer mit der entsprechenden Klasse (Class<T> entityClass)
Hier die Util Methode:
Mein Problem ist nun aber, dass ich verschiedene User Klassen habe kann.
Bspw. aus meinem allgemeinen Projekt (Share) oder aus einem anderen Projekt...
Die Abfragen sind immer die gleichen. Das Problem ist aber, dass ich in meiner UserService Klasse die Klasse direkt drin habe:
UserImpl.class (siehe bei der Methode findUserByQuery).
Wie schaffe ich es, dass ich verschiedene Klassen angeben kann?
Ich könnte die Klasse so bauen, dass ich immer die entsprechende Klasse mitgeben muss, aber ich weiß nicht, ob das nicht eleganter geht?
ich möchte gerade gerade ein Projekt aufbauen, welches ich in andere Projekte vererben kann, sodass ich einzelne Codeteile nicht immer neu implementieren muss.
Hierzu gehören auch meine Datenbankabfragen.
Ich habe bspw. eine UserService - Klasse, in der ich nun so Dinge mache wie:
public UserInterface findUserByEmail(String email);
Ich habe mir hierzu bereits eine Util Klasse (JpaQueryUtil) gebaut, mit der ich meine Abfragen erstelle, welche für jegliche Klassen gilt...
Hier gehe ich dann in die Methode immer mit der entsprechenden Klasse (Class<T> entityClass)
Java:
/**
* Findet den User anhand der Email
*/
public UserInterface findUserByEmail(String email) {
JpaQueryBuilder jpaQueryBuilder = new JpaQueryBuilder();
List<JpaQueryParameter> jpaQueryParameterList = jpaQueryBuilder.getJpaQueryParameterList();
jpaQueryParameterList.add(new JpaQueryParameter("email", OperatorEnum.EQUAL, email));
UserInterface result = findUserByQuery(jpaQueryBuilder);
return result;
}
Code:
@SuppressWarnings({ "unchecked", "rawtypes" })
public UserInterface findUserByQuery(JpaQueryBuilder jpaQueryBuilder) {
UserInterface user = (UserImpl) new JpaQueryUtil().findSingleByQuery(jpaQueryBuilder, UserImpl.class, entityManager);
return user;
}
Hier die Util Methode:
Code:
@SuppressWarnings({ "unchecked", "hiding" })
public <T> T findSingleByQuery(JpaQueryBuilder jpaQueryBuilder, Class<T> entityClass, EntityManager entityManager) {
try {
T entityObject = null;
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<T> cr = cb.createQuery(entityClass);
Root<T> root = cr.from(entityClass);
cr.select(root);
List<JpaQueryParameter> list = jpaQueryBuilder.getJpaQueryParameterList();
if (list != null && !list.isEmpty()) {
List<Predicate> predicateList = new ArrayList<>();
for (JpaQueryParameter jpaQueryParameter : list) {
Predicate predicate = createPredicate(cb, root, jpaQueryParameter);
predicateList.add(predicate);
}
if (predicateList != null && !predicateList.isEmpty()) {
cr.where(cb.and(predicateList.toArray(new Predicate[predicateList.size()])));
}
}
Query query = (Query) entityManager.createQuery(cr);
entityObject = (T) query.getSingleResult();
return entityObject;
} catch (NoResultException e) {
return null;
} catch (NonUniqueResultException e) {
LOGGER.error(ExceptionUtils.getFullStackTrace(e));
return null;
}
catch (Exception e) {
LOGGER.error(ExceptionUtils.getFullStackTrace(e));
return null;
}
}
Mein Problem ist nun aber, dass ich verschiedene User Klassen habe kann.
Bspw. aus meinem allgemeinen Projekt (Share) oder aus einem anderen Projekt...
Die Abfragen sind immer die gleichen. Das Problem ist aber, dass ich in meiner UserService Klasse die Klasse direkt drin habe:
UserImpl.class (siehe bei der Methode findUserByQuery).
Wie schaffe ich es, dass ich verschiedene Klassen angeben kann?
Ich könnte die Klasse so bauen, dass ich immer die entsprechende Klasse mitgeben muss, aber ich weiß nicht, ob das nicht eleganter geht?
Java:
public UserInterface findUserByEmail(Class<T> entityClass, String email) {
JpaQueryBuilder jpaQueryBuilder = new JpaQueryBuilder();
List<JpaQueryParameter> jpaQueryParameterList = jpaQueryBuilder.getJpaQueryParameterList();
jpaQueryParameterList.add(new JpaQueryParameter("email", OperatorEnum.EQUAL, email));
UserInterface result = findUserByQuery(entityClass, jpaQueryBuilder);
return result;
}