Skip to content

Commit

Permalink
FORGE-1085 Added code to generate ORDER BY clause.
Browse files Browse the repository at this point in the history
This ensures that collections are ordered by the primary key in the resource representations for top-level collections.
  • Loading branch information
VineetReynolds committed Aug 3, 2013
1 parent de7faa6 commit 744d7dd
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -178,11 +178,13 @@ public void endpointFromEntity(
String entityTable = getEntityTable(entity);
String selectExpression = getSelectExpression(entity, entityTable);
String idClause = getIdClause(entity, entityTable);
String orderClause = getOrderClause(entity, getJpqlEntityVariable(entityTable));
String resourcePath = getResourcePath(java, entityTable);
map.put("persistenceUnitName", persistenceUnitName);
map.put("entityTable", entityTable);
map.put("selectExpression", selectExpression);
map.put("idClause", idClause);
map.put("orderClause", orderClause);
map.put("resourcePath", resourcePath);

Writer output = new StringWriter();
Expand Down Expand Up @@ -376,7 +378,7 @@ else if (!Strings.isNullOrEmpty(a.getStringValue()))

private String getSelectExpression(JavaClass entity, String entityTable)
{
char entityVariable = entityTable.toLowerCase().charAt(0);
char entityVariable = getJpqlEntityVariable(entityTable);
StringBuilder expressionBuilder = new StringBuilder();
expressionBuilder.append("SELECT DISTINCT ");
expressionBuilder.append(entityVariable);
Expand Down Expand Up @@ -418,6 +420,7 @@ else if (member instanceof Field)
}
}
}

return expressionBuilder.toString();
}

Expand All @@ -438,12 +441,46 @@ private String getIdClause(JavaClass entity, String entityTable)
{
id = memberName;
}
char entityVariable = entityTable.toLowerCase().charAt(0);
char entityVariable = getJpqlEntityVariable(entityTable);
return "WHERE " + entityVariable + "." + id + " = " + ":entityId";
}
}
return null;
}

private String getOrderClause(JavaClass entity, char entityVariable)
{
StringBuilder expressionBuilder = new StringBuilder();

// Add the ORDER BY clause
for (Member<JavaClass, ?> member : entity.getMembers())
{
if (member.hasAnnotation(Id.class))
{
String memberName = member.getName();
String id = null;
if (member instanceof Method)
{
// Getters are expected to obey JavaBean conventions
id = Strings.uncapitalize(memberName.substring(2));
}
if (member instanceof Field)
{
id = memberName;
}
expressionBuilder.append("ORDER BY ");
expressionBuilder.append(entityVariable);
expressionBuilder.append('.');
expressionBuilder.append(id);
}
}
return expressionBuilder.toString();
}

private char getJpqlEntityVariable(String entityTable)
{
return entityTable.toLowerCase().charAt(0);
}

private List<JavaResource> selectTargets(final PipeOut out, Resource<?>[] targets)
throws FileNotFoundException
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public class ${entityTable}Endpoint
@Produces("${contentType}")
public Response findById(@PathParam("id") ${idType} id)
{
TypedQuery<${entity.getName()}> findByIdQuery = em.createQuery("${selectExpression} ${idClause}", ${entity.getName()}.class);
TypedQuery<${entity.getName()}> findByIdQuery = em.createQuery("${selectExpression} ${idClause} ${orderClause}", ${entity.getName()}.class);
findByIdQuery.setParameter("entityId", id);
${entity.getName()} entity = findByIdQuery.getSingleResult();
if (entity == null) {
Expand All @@ -59,7 +59,7 @@ public class ${entityTable}Endpoint
@Produces("${contentType}")
public List<${entity.getName()}> listAll()
{
final List<${entity.getName()}> results = em.createQuery("${selectExpression}", ${entity.getName()}.class).getResultList();
final List<${entity.getName()}> results = em.createQuery("${selectExpression} ${orderClause}", ${entity.getName()}.class).getResultList();
return results;
}

Expand Down

0 comments on commit 744d7dd

Please sign in to comment.