Skip to content

Instantly share code, notes, and snippets.

@mkalkov
Created February 9, 2018 10:19
Show Gist options
  • Select an option

  • Save mkalkov/3b9dde8129ff359969abf08308201fa5 to your computer and use it in GitHub Desktop.

Select an option

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

mkalkov commented Feb 9, 2018

Copy link
Copy Markdown
Author

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