Methode für jede beliebe Entity erstellen

beta20

Top Contributor
Hallo,

ich habe derzeit das folgende Problem, dass ich verschiedene Methoden gefühlt 100 mal habe.
Der einzigige Unterschied ist, dass ich als Rückgabewert eine andere Klasse zurückgebe.

Meine Methoden sind für Datenbankabfragen (JPA) erstellt. Hier gehe ich mit einer allgemeinen Liste als Paramater herein (List<ObjectForSearchList> searchList).
Dort werden dann Dinge gespeichert, die ich für die Datenbanbafrage benötige (WHERE Clause).

Hier mal ein Beispiel einer Methode:

Java:
    public List<MyEntity> findAllMyEntityListByQueryAndNumberOfResult(
            List<ObjectForSearchList> searchList, int numberOfResult) {

        LOGGER.info("START findAllMyEntityListByQuery");

        List<MyEntity> list = null;

        try {
      
           StringBuilder query = new StringBuilder("SELECT m FROM MyEntity m");
            StringBuilder orderBy = new StringBuilder(" ORDER BY m.createDate DESC");

            // WHERE Clause
            JpaQueryBuilderHelper jpaQueryBuilderHelper = createQuery(searchList);

            query.append((jpaQueryBuilderHelper == null ? "" : jpaQueryBuilderHelper.getSqlString()));
            query.append((orderBy == null ? "" : orderBy));

           String  theQuery = query.toString();
            LOGGER.info("QUERY: " + theQuery);

            Query q = entityManager.createQuery(theQuery);
            q = JpaQueryBuilderHelper.createJpaQuery(q, jpaQueryBuilderHelper.getJpaQueryBuilderList());

            q.setMaxResults(numberOfResult);

            list = q.getResultList();
        } catch (NoResultException e) {
            return null;
        } catch (Exception e) {
            LOGGER.error(ExceptionUtils.getFullStackTrace(e));
        }

        LOGGER.info("END findAllMyEntityListByQuery");
        return list;
    }

Die ganzen Service Klassen möchte ich nicht löschen, die ich für die verschiedenen Entity - Typen habe (da auch @Transactional etc. verwendet wird).
Was ich aber verändern möchte ist, dass ich eine Methode habe, die mit einen "allgemeine Entity" als Rückgabewert liefert, sodass ich die Implementierung der Methode an einer zentralen Stelle habe.

Meine Frage ist nun, wie müsste diese Methode aussehen?
Ich habe mal etwas mit <T> gelesen, bin mir aber nicht sicher, ob das hier zutrifft?

Also sowas dann wie:
Code:
public List<T> findAllMyEntityListByQueryAndNumberOfResult(

            List<ObjectForSearchList> searchList, int numberOfResult) {
....
return t;
}

Danke für jede Hilfe
 
So in der Richtung:
Java:
public <T> List<T> findAllMyEntityListByQueryAndNumberOfResult(
            List<ObjectForSearchList> searchList, int numberOfResult, Class<T> clazz) {
 
könntest du bitte die ganze Methode hier definieren (also nicht nur den Methodenkopf)...
Insbesondere der Rückgabewert ist mir auch nicht klar...
 
Für ein einfaches findAll mit JPQL sollte das etwa so funktionieren:
Java:
public <T> List<T> findAll(String entityName, Class<T> entityClass) {
    String query = String.format("SELECT e FROM %s e", entityName);
    TypedQuery<T> tq = em.createQuery(query, entityClass);
    return getResultList();
}

public <T> List<T> findAll(Class<T> entityClass) {
    return findAll(entityClass.getSimpleName(), entityClass);
}
 

Neue Themen


Zurück
Oben