{"record":{"id":"67214d9e542d4d3d","repo":"hibernate/hibernate-orm","slug":"min-not-supported","errorCode":null,"errorMessage":"min() not supported","messagePattern":"min\\(\\) not supported","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/query/sqm/tree/spi/expression/SqmBooleanExpressionImplementor.java","lineNumber":28,"sourceCode":"import org.hibernate.query.sqm.tree.spi.predicate.SqmPredicate;\n\n/**\n * @author Steve Ebersole\n */\npublic interface SqmBooleanExpressionImplementor\n\t\textends SqmComparableExpressionImplementor<Boolean>, SqmBooleanExpression {\n\tSqmCriteriaNodeBuilder nodeBuilder();\n\n\t@Nonnull\n\t@Override\n\tdefault SqmComparableExpression<Boolean> max() {\n\t\tthrow new UnsupportedOperationException( \"max() not supported\" );\n\t}\n\n\t@Nonnull\n\t@Override\n\tdefault SqmComparableExpression<Boolean> min() {\n\t\tthrow new UnsupportedOperationException( \"min() not supported\" );\n\t}\n\n\t@Nonnull\n\t@Override\n\tdefault SqmPredicate and(@Nonnull Expression<Boolean> y) {\n\t\treturn nodeBuilder().and( this, y );\n\t}\n\n\t@Nonnull\n\t@Override\n\tdefault SqmPredicate or(@Nonnull Expression<Boolean> y) {\n\t\treturn nodeBuilder().or( this, y );\n\t}\n\n\t@Nonnull\n\t@Override\n\tdefault SqmPredicate not() {\n\t\treturn nodeBuilder().not( this );","sourceCodeStart":10,"sourceCodeEnd":46,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/spi/expression/SqmBooleanExpressionImplementor.java#L10-L46","documentation":"SqmBooleanExpressionImplementor provides default implementations of the Hibernate expression extensions for Boolean-typed nodes; min() is deliberately unsupported because the SQM type system defines no minimum/maximum semantics for Boolean values, so calling it throws UnsupportedOperationException('min() not supported').","triggerScenarios":"booleanExpression.min() in Hibernate 6 criteria code, e.g. ((JpaExpression<Boolean>) root.get(\"enabled\")).min() or chained fluent calls on expressions returned by cb.isTrue/cb.isFalse.","commonSituations":"Aggregation of boolean flags in report queries; generic min/max builders that call both methods on arbitrary comparable expressions; porting native queries where the database accepted min(boolean).","solutions":["Rewrite as a numeric aggregate: cb.max(cb.selectCase().when(cb.isTrue(flag), 1).otherwise(0)) (max of the numeric encoding gives the same 'min boolean' information).","Use cb.sum(...) over the case encoding for counting semantics.","Remap the attribute as a numeric type or compute the aggregate in native SQL.","Type-guard aggregation helpers so min()/max() only run on numeric expressions."],"exampleFix":"// before\nJpaExpression<Boolean> enabled = root.get(\"enabled\");\nquery.select(enabled.min()); // UnsupportedOperationException: min() not supported\n// after\nquery.select(cb.max(cb.selectCase().when(cb.isTrue(root.get(\"enabled\")), 0).otherwise(1))); // 0 iff any row enabled","handlingStrategy":"type-guard","validationCode":"static boolean numeric(Expression<?> e) {\n    return e.getJavaType() != null && Number.class.isAssignableFrom(e.getJavaType());\n}\n// only call expr.min() when numeric(expr) is true","typeGuard":"static boolean aggregatableByMinMax(Expression<?> e) {\n    Class<?> jt = e.getJavaType();\n    return jt != null && Number.class.isAssignableFrom(jt);\n}","tryCatchPattern":null,"preventionTips":["Rewrite boolean aggregates as case-when numeric aggregates up front.","Add query-builder tests asserting no boolean expression reaches min()/max().","Prefer numeric column types for fields that feed report aggregations."],"tags":["hibernate","criteria-api","aggregation","boolean","unsupported-operation"],"backgroundTag":"min-max-on-non-numeric-type","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}