HHH-17772 tolerate vararg Sort parameters

This commit is contained in:
Gavin King 2024-02-24 00:51:05 +01:00
parent df79c4491a
commit 2281805e91
3 changed files with 76 additions and 40 deletions

View File

@ -15,6 +15,7 @@ import org.hibernate.query.Page;
import org.hibernate.query.SortDirection; import org.hibernate.query.SortDirection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -209,29 +210,6 @@ public abstract class AbstractQueryMethod implements MetaAttribute {
boolean setOrder(StringBuilder declaration, boolean unwrapped, String paramName, String paramType) { boolean setOrder(StringBuilder declaration, boolean unwrapped, String paramName, String paramType) {
unwrapQuery( declaration, unwrapped ); unwrapQuery( declaration, unwrapped );
if ( paramType.startsWith(JD_SORT) ) {
final String sortableEntityClass = getSortableEntityClass();
if ( sortableEntityClass != null ) {
annotationMetaEntity.staticImport(SortDirection.class.getName(), "ASCENDING");
annotationMetaEntity.staticImport(SortDirection.class.getName(), "DESCENDING");
declaration
.append("\n\t\t\t.setOrder(")
.append(annotationMetaEntity.importType(Order.class.getName()))
.append(".by(")
.append(annotationMetaEntity.importType(sortableEntityClass))
.append(".class, ")
.append(paramName)
.append(".property()")
.append(",\n\t\t\t\t\t")
.append(paramName)
.append(".isAscending() ? ASCENDING : DESCENDING")
.append("))");
return true;
}
else {
return false;
}
}
if ( paramType.startsWith(JD_ORDER) ) { if ( paramType.startsWith(JD_ORDER) ) {
final String sortableEntityClass = getSortableEntityClass(); final String sortableEntityClass = getSortableEntityClass();
if ( sortableEntityClass != null ) { if ( sortableEntityClass != null ) {
@ -252,10 +230,46 @@ public abstract class AbstractQueryMethod implements MetaAttribute {
.append(",\n\t\t\t\t\t\t") .append(",\n\t\t\t\t\t\t")
.append("sort.isAscending() ? ASCENDING : DESCENDING") .append("sort.isAscending() ? ASCENDING : DESCENDING")
.append(", sort.ignoreCase())));\n\t\t\t}})"); .append(", sort.ignoreCase())));\n\t\t\t}})");
return true;
} }
else { }
return false; else if ( paramType.startsWith(JD_SORT) && paramType.endsWith("...") ) {
final String sortableEntityClass = getSortableEntityClass();
if ( sortableEntityClass != null ) {
annotationMetaEntity.staticImport(SortDirection.class.getName(), "ASCENDING");
annotationMetaEntity.staticImport(SortDirection.class.getName(), "DESCENDING");
annotationMetaEntity.staticImport(Arrays.class.getName(), "asList");
annotationMetaEntity.staticImport(Order.class.getName(), "by");
annotationMetaEntity.staticImport(Collectors.class.getName(), "toList");
declaration
.append("\n\t\t\t.setOrder(asList(")
.append(paramName)
.append(").stream().map(sort -> ")
.append("by(")
.append(annotationMetaEntity.importType(sortableEntityClass))
.append(".class, ")
.append("sort.property()")
.append(",\n\t\t\t\t\t\t")
.append("sort.isAscending() ? ASCENDING : DESCENDING")
.append(", sort.ignoreCase()))\n\t\t\t\t.collect(toList())\n\t\t\t)");
}
}
else if ( paramType.startsWith(JD_SORT) ) {
final String sortableEntityClass = getSortableEntityClass();
if ( sortableEntityClass != null ) {
annotationMetaEntity.staticImport(SortDirection.class.getName(), "ASCENDING");
annotationMetaEntity.staticImport(SortDirection.class.getName(), "DESCENDING");
declaration
.append("\n\t\t\t.setOrder(")
.append(annotationMetaEntity.importType(Order.class.getName()))
.append(".by(")
.append(annotationMetaEntity.importType(sortableEntityClass))
.append(".class, ")
.append(paramName)
.append(".property()")
.append(",\n\t\t\t\t\t")
.append(paramName)
.append(".isAscending() ? ASCENDING : DESCENDING")
.append("))");
} }
} }
else if ( paramType.endsWith("...") ) { else if ( paramType.endsWith("...") ) {

View File

@ -9,8 +9,10 @@ package org.hibernate.jpamodelgen.annotation;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
import org.hibernate.jpamodelgen.util.Constants; import org.hibernate.jpamodelgen.util.Constants;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.stream.Collectors;
import static org.hibernate.jpamodelgen.util.Constants.JD_SORT; import static org.hibernate.jpamodelgen.util.Constants.JD_SORT;
import static org.hibernate.jpamodelgen.util.TypeUtils.isPrimitive; import static org.hibernate.jpamodelgen.util.TypeUtils.isPrimitive;
@ -190,6 +192,7 @@ public class CriteriaFinderMethod extends AbstractFinderMethod {
for ( int i = 0; i < paramNames.size(); i ++ ) { for ( int i = 0; i < paramNames.size(); i ++ ) {
final String paramName = paramNames.get(i); final String paramName = paramNames.get(i);
final String paramType = paramTypes.get(i); final String paramType = paramTypes.get(i);
//TODO: Jakarta Order!!
if ( isJakartaSortParam(paramType) ) { if ( isJakartaSortParam(paramType) ) {
if ( firstOrderBy ) { if ( firstOrderBy ) {
firstOrderBy = false; firstOrderBy = false;
@ -197,7 +200,7 @@ public class CriteriaFinderMethod extends AbstractFinderMethod {
else { else {
declaration.append(','); declaration.append(',');
} }
orderBy(declaration, paramName); orderBy(declaration, paramName, paramType.endsWith("..."));
} }
} }
} }
@ -255,8 +258,20 @@ public class CriteriaFinderMethod extends AbstractFinderMethod {
.append(')'); .append(')');
} }
private static void orderBy(StringBuilder declaration, String paramName) { private void orderBy(StringBuilder declaration, String paramName, boolean variadic) {
// TODO: Sort.ignoreCase() // TODO: Sort.ignoreCase()
if ( variadic ) {
annotationMetaEntity.staticImport(Arrays.class.getName(), "asList");
annotationMetaEntity.staticImport(Collectors.class.getName(), "toList");
declaration
.append("\n\t\tasList(")
.append(paramName)
.append(")\n\t\t\t.stream()\n\t\t\t.map(sort -> sort.isAscending()\n")
.append("\t\t\t\t\t? builder.asc(entity.get(sort.property()))\n")
.append("\t\t\t\t\t: builder.desc(entity.get(sort.property()))\n")
.append("\t\t\t)\n\t\t\t.collect(toList())");
}
else {
declaration declaration
.append("\n\t\t") .append("\n\t\t")
.append(paramName) .append(paramName)
@ -270,6 +285,7 @@ public class CriteriaFinderMethod extends AbstractFinderMethod {
.append(paramName) .append(paramName)
.append(".property()))"); .append(".property()))");
} }
}
private void parameter(StringBuilder declaration, int i, String paramName, String paramType) { private void parameter(StringBuilder declaration, int i, String paramName, String paramType) {
declaration declaration

View File

@ -47,6 +47,9 @@ public interface BookAuthorRepository {
@Find @Find
List<Book> byPubDate2(LocalDate publicationDate, Order<? super Book> order); List<Book> byPubDate2(LocalDate publicationDate, Order<? super Book> order);
@Find
List<Book> byPubDate3(LocalDate publicationDate, Sort<? super Book>... order);
@Insert @Insert
void create(Book book); void create(Book book);
@ -70,4 +73,7 @@ public interface BookAuthorRepository {
@Query("from Book where title like :title") @Query("from Book where title like :title")
List<Book> books2(@Param("title") String titlePattern, Limit limit); List<Book> books2(@Param("title") String titlePattern, Limit limit);
@Query("from Book where title like :title")
List<Book> books3(String title, Limit limit, Sort<Book>... order);
} }