patternjavaModerate
JPA Query to Return a Map
Viewed 0 times
returnquerymapjpa
Problem
I wrote the following JPA method that queries a database to return a distinct list of a String field (called mtfcc) of a Location object. I then took the list of strings to query for the associated name for that MTFCC.
Could I just modify the first query to get the results, without having to use the for loop to get the associated name field?
Could I just modify the first query to get the results, without having to use the for loop to get the associated name field?
@Override
public Map getAvailableBorderTypes() {
// create empty map to store results in. If we don't find results, an empty hashmap will be returned
Map results = new HashMap();
EntityManager em = entityManagerFactory.createEntityManager();
// get the distinct mtfcc's
String jpaQuery = "SELECT DISTINCT location.mtfcc FROM Location location";
// get the distinct mtfcc codes
List mtfccList = (List) em.createQuery(jpaQuery).getResultList();
// cycle through the mtfcc list and get the name to associate with it
for (String mtfcc: mtfccList) {
String nameQuery = "SELECT DISTINCT location.name FROM Location location WHERE location.mtfcc = ?1";
String name = (String) em.createQuery(nameQuery).setParameter(1, mtfcc).getSingleResult();
results.put(mtfcc, name);
}
return results;
}Solution
Ok, I've got a possible simplification for you. The goal I had was to get to using one query:
It turns out that
Here's the code to get it to work:
SELECT DISTINCT location.mftcc, location.name FROM Location locationIt turns out that
Query.getResultList() behaves funny: It returns a List of Object[]! Each entry in the list represents a row returned from the database, where the entries in the Object[] are each field specified in the SELECT. Also, to furthur complicate matters, each field is returned as the JPA type. So, you have to treat the whole array as an Object[] and cast the individual elements.Here's the code to get it to work:
public Map getAvailableBorderTypes() {
// create empty map to store results in. If we don't find results, an empty hashmap will be returned
Map results = new HashMap();
EntityManager em = entityManagerFactory.createEntityManager();
// Construct and run query
String jpaQuery = "SELECT DISTINCT location.mftcc, location.name FROM Location location";
List resultList = em.createQuery(jpaQuery).getResultList();
// Place results in map
for (Object[] borderTypes: resultList) {
results.put((String)borderTypes[0], (String)borderTypes[1]);
}
return results;
}Code Snippets
SELECT DISTINCT location.mftcc, location.name FROM Location locationpublic Map<String, String> getAvailableBorderTypes() {
// create empty map to store results in. If we don't find results, an empty hashmap will be returned
Map<String, String> results = new HashMap<String, String>();
EntityManager em = entityManagerFactory.createEntityManager();
// Construct and run query
String jpaQuery = "SELECT DISTINCT location.mftcc, location.name FROM Location location";
List<Object[]> resultList = em.createQuery(jpaQuery).getResultList();
// Place results in map
for (Object[] borderTypes: resultList) {
results.put((String)borderTypes[0], (String)borderTypes[1]);
}
return results;
}Context
StackExchange Code Review Q#1409, answer score: 13
Revisions (0)
No revisions yet.