Skip to content

Commit

Permalink
first solution for result set mappings
Browse files Browse the repository at this point in the history
  • Loading branch information
gavinking committed Dec 20, 2024
1 parent 32821db commit 7ae782e
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 1 deletion.
12 changes: 12 additions & 0 deletions api/src/main/java/jakarta/persistence/ColumnResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package jakarta.persistence;

import java.lang.annotation.Annotation;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
Expand Down Expand Up @@ -80,4 +81,15 @@
* @since 2.1
*/
Class<?> type() default void.class;

record Map(String name, Class<?> type)
implements ColumnResult, SqlResultSetMapping.MappingElement {
Map(String name) {
this(name, void.class);
}
@Override
public Class<? extends Annotation> annotationType() {
return ColumnResult.class;
}
}
}
9 changes: 9 additions & 0 deletions api/src/main/java/jakarta/persistence/ConstructorResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package jakarta.persistence;

import java.lang.annotation.Annotation;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
Expand Down Expand Up @@ -87,4 +88,12 @@
* {@linkplain #targetClass target class}, in order.
*/
ColumnResult[] columns();

record Map(Class<?> targetClass, ColumnResult... columns)
implements ConstructorResult, SqlResultSetMapping.MappingElement {
@Override
public Class<? extends Annotation> annotationType() {
return ConstructorResult.class;
}
}
}
17 changes: 16 additions & 1 deletion api/src/main/java/jakarta/persistence/EntityResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package jakarta.persistence;

import java.lang.annotation.Annotation;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
Expand Down Expand Up @@ -65,7 +66,7 @@
*/
@Target({})
@Retention(RUNTIME)
public @interface EntityResult {
public @interface EntityResult {

/**
* The class of the result.
Expand All @@ -90,4 +91,18 @@
* the entity instance.
*/
String discriminatorColumn() default "";

record Map(Class<?> entityClass, String discriminatorColumn, FieldResult[] fields, LockModeType lockMode)
implements EntityResult, SqlResultSetMapping.MappingElement {
Map(Class<?> entityClass, FieldResult... fields) {
this(entityClass, "", fields, LockModeType.NONE);
}
Map(Class<?> entityClass, String discriminatorColumn, FieldResult... fields) {
this(entityClass, discriminatorColumn, fields, LockModeType.NONE);
}
@Override
public Class<? extends Annotation> annotationType() {
return EntityResult.class;
}
}
}
9 changes: 9 additions & 0 deletions api/src/main/java/jakarta/persistence/FieldResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package jakarta.persistence;

import java.lang.annotation.Annotation;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
Expand Down Expand Up @@ -72,4 +73,12 @@
* the column alias, if applicable.
*/
String column();

record Map(String name, String column)
implements FieldResult {
@Override
public Class<? extends Annotation> annotationType() {
return FieldResult.class;
}
}
}
31 changes: 31 additions & 0 deletions api/src/main/java/jakarta/persistence/SqlResultSetMapping.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,13 @@

package jakarta.persistence;

import java.lang.annotation.Annotation;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.reflect.Array;
import java.util.Arrays;

import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

Expand Down Expand Up @@ -90,4 +94,31 @@
* Specifies the result set mapping to scalar values.
*/
ColumnResult[] columns() default {};

interface MappingElement {}

record Map(String name, EntityResult[] entities, ConstructorResult[] classes, ColumnResult[] columns)
implements SqlResultSetMapping {
@SuppressWarnings("unchecked")
private static <R> R[] newArrayInstance(Class<R> type, int length) {
return (R[]) Array.newInstance(type, length);
}
static <R> R[] extract(Class<R> type, MappingElement[] mappingElements) {
return Arrays.stream(mappingElements)
.filter(type::isInstance)
.toArray(length -> newArrayInstance(type, length));
}
Map(String name, MappingElement... mappings) {
this(name,
extract(EntityResult.class, mappings),
extract(ConstructorResult.class, mappings),
extract(ColumnResult.class, mappings));
}
@Override
public Class<? extends Annotation> annotationType() {
return SqlResultSetMapping.class;
}
}
}


0 comments on commit 7ae782e

Please sign in to comment.