Skip to content

Instantly share code, notes, and snippets.

@mkalkov
Created February 9, 2018 10:19
Show Gist options
  • Save mkalkov/3b9dde8129ff359969abf08308201fa5 to your computer and use it in GitHub Desktop.
Save mkalkov/3b9dde8129ff359969abf08308201fa5 to your computer and use it in GitHub Desktop.
SQL query builde example
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();
}
@mkalkov
Copy link
Author

mkalkov commented Feb 9, 2018

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment