I love the “pattern” used in this post (which I got from here).
Working with JPA queries I tried to follow the same pattern. In a REST resource I needed to query for one entity and change the location attribute.
[UPDATE] This is mostly realized here [UPDATE]
The code that visually separates the query from business looks like this now:
oneEntity {
user: User =>
val loc = user.getUsersLocation
loc.setLatitude(eStatus.getLocation.getLatitude)
loc.setLongitude(eStatus.getLocation.getLongitude)
loc.setLocationType(eStatus.getLocation.getLocationType)
} withQuery ("select u from User u where u.name like ?1",
sc.getUserPrincipal.getName)
And the resource base class code providing that:
protected def oneEntity[A, T](body: (T) => A): DoWithQuery[A, T] =
new DoWithQuery[A, T](body)
protected class DoWithQuery[A, T](body: (T) => A) {
def withQuery(query: String, param: AnyRef*): A = {
val q = createQuery(query)
var i: Int = 1
param.foreach {
x =>
q.setParameter(i, x)
i += 1
}
val res = q.getResultList
if (res.isEmpty) throw new WebApplicationException(404)
val user = res.get(0).asInstanceOf[T]
body(user)
}
}

Twitter
Xing
Facebook