Created
February 9, 2018 10:19
-
-
Save mkalkov/3b9dde8129ff359969abf08308201fa5 to your computer and use it in GitHub Desktop.
SQL query builde example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public final class SearchCriteria { | |
public enum Criterion { | |
KUNDREF("kundRef"), | |
LANSTILLHORIGHET("lanstillhorighet"), | |
STODAR("stodar"); | |
// I only needed column name, no datatypes here | |
private final String columnName; | |
Criterion(final String columnName) { | |
this.columnName = columnName; | |
} | |
public String getColumnName() { | |
return columnName; | |
} | |
} | |
public static final class SearchCriteriaBuilder { | |
private final Map<Criterion, Object> criteriaMap = new HashMap<>(); | |
public SearchCriteriaBuilder stodar(final Stodar stodar) { | |
criteriaMap.put(Criterion.STODAR, stodar); | |
return this; | |
} | |
public SearchCriteriaBuilder kundRef(final KundRef kundRef) { | |
criteriaMap.put(Criterion.KUNDREF, kundRef); | |
return this; | |
} | |
public SearchCriteriaBuilder lanstillhorighet(final LanEnum lanstillhorighet) { | |
criteriaMap.put(Criterion.LANSTILLHORIGHET, lanstillhorighet); | |
return this; | |
} | |
public SearchCriteria build() { | |
return new SearchCriteria(criteriaMap); | |
} | |
} | |
public static SearchCriteriaBuilder searchBuilder() { | |
return new SearchCriteriaBuilder(); | |
} | |
private final ImmutableSortedMap<Criterion, Object> immutableCriteriaMap; | |
private SearchCriteria(final Map<Criterion, ?> criteria) { | |
immutableCriteriaMap = ImmutableSortedMap.copyOf(criteria); | |
} | |
public ImmutableSortedMap<Criterion, Object> getCriteria() { | |
return immutableCriteriaMap; | |
} | |
} | |
// Usage example | |
public List<StodProjection> findByLanStodar(final Stodar stodar, final LanEnum lanstillhorighet) { | |
checkNotNull(stodar, lanstillhorighet); | |
SearchCriteria search = SearchCriteria.searchBuilder().stodar(stodar).lanstillhorighet(lanstillhorighet).build(); | |
final String jpqlString = QueryBuilder.buildSelectString(search); | |
logger.info("Söker med JPQL:\n" + jpqlString + "\nMed input: " + search); | |
final TypedQuery<StodProjection> query = buildTypedQuery(jpqlString, search); | |
return query.getResultList(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Just det, buildTypedQuery behövdes eftersom JPA vill att man inte bara bygger en JPQL sats, men även binder variabler till den i en separat steg. Då har jag valt att låta buildSelectString(search) bygga själva JPQL med variabelnamn (lika med kolumnnamn i db), och buildTypedQuery(jpqlString, search) binda variabelvärde till variabelnamn.