Skip to content

Commit 596e07e

Browse files
committed
Consider EntityName in JpqlQueryBuilder.
Closes #4036
1 parent 4adf2e3 commit 596e07e

File tree

3 files changed

+33
-20
lines changed

3 files changed

+33
-20
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/DefaultJpaEntityMetadata.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
import jakarta.persistence.Entity;
1919

20+
import java.util.function.Function;
21+
2022
import org.springframework.core.annotation.AnnotatedElementUtils;
2123
import org.springframework.util.Assert;
2224
import org.springframework.util.StringUtils;
@@ -49,8 +51,13 @@ public Class<T> getJavaType() {
4951

5052
@Override
5153
public String getEntityName() {
54+
return getEntityNameOr(Class::getSimpleName);
55+
}
56+
57+
String getEntityNameOr(Function<Class<?>, String> alternative) {
5258

5359
Entity entity = AnnotatedElementUtils.findMergedAnnotation(domainType, Entity.class);
54-
return null != entity && StringUtils.hasText(entity.name()) ? entity.name() : domainType.getSimpleName();
60+
return null != entity && StringUtils.hasText(entity.name()) ? entity.name() : alternative.apply(domainType);
5561
}
62+
5663
}

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpqlQueryBuilder.java

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ private JpqlQueryBuilder() {}
5858
* @return
5959
*/
6060
public static Entity entity(Class<?> from) {
61-
return new Entity(from.getName(), from.getSimpleName(),
61+
DefaultJpaEntityMetadata<?> entityMetadata = new DefaultJpaEntityMetadata<>(from);
62+
return new Entity(from.getName(), entityMetadata.getEntityNameOr(Class::getName),
6263
getAlias(from.getSimpleName(), Predicates.isTrue(), () -> "r"));
6364
}
6465

@@ -538,7 +539,8 @@ static PathAndOrigin path(Origin origin, String path) {
538539
if (origin instanceof Entity entity) {
539540

540541
try {
541-
PropertyPath from = PropertyPath.from(path, ClassUtils.forName(entity.entity, Entity.class.getClassLoader()));
542+
PropertyPath from = PropertyPath.from(path,
543+
ClassUtils.forName(entity.className, Entity.class.getClassLoader()));
542544
return new PathAndOrigin(from, entity, false);
543545
} catch (ClassNotFoundException e) {
544546
throw new RuntimeException(e);
@@ -847,7 +849,7 @@ String render() {
847849
StringBuilder where = new StringBuilder();
848850
StringBuilder orderby = new StringBuilder();
849851
StringBuilder result = new StringBuilder(
850-
"SELECT %s FROM %s %s".formatted(selection.render(renderContext), entity.getEntity(), entity.getAlias()));
852+
"SELECT %s FROM %s %s".formatted(selection.render(renderContext), entity.getName(), entity.getAlias()));
851853

852854
if (getWhere() != null) {
853855
where.append(" WHERE ").append(getWhere().render(renderContext));
@@ -1024,28 +1026,24 @@ public interface Origin {
10241026
*/
10251027
public static final class Entity implements Origin {
10261028

1029+
private final String className;
10271030
private final String entity;
1028-
private final String simpleName;
10291031
private final String alias;
10301032

10311033
/**
1032-
* @param entity fully-qualified entity name.
1033-
* @param simpleName simple class name.
1034+
* @param className fully-qualified entity name.
1035+
* @param entity entity name (as in {@code @Entity(…)}).
10341036
* @param alias alias to use.
10351037
*/
1036-
Entity(String entity, String simpleName, String alias) {
1038+
Entity(String className, String entity, String alias) {
1039+
this.className = className;
10371040
this.entity = entity;
1038-
this.simpleName = simpleName;
10391041
this.alias = alias;
10401042
}
10411043

1042-
public String getEntity() {
1043-
return entity;
1044-
}
1045-
10461044
@Override
10471045
public String getName() {
1048-
return simpleName;
1046+
return entity;
10491047
}
10501048

10511049
public String getAlias() {
@@ -1061,18 +1059,18 @@ public boolean equals(Object obj) {
10611059
return false;
10621060
}
10631061
var that = (Entity) obj;
1064-
return Objects.equals(this.entity, that.entity) && Objects.equals(this.simpleName, that.simpleName)
1062+
return Objects.equals(this.entity, that.entity) && Objects.equals(this.className, that.className)
10651063
&& Objects.equals(this.alias, that.alias);
10661064
}
10671065

10681066
@Override
10691067
public int hashCode() {
1070-
return Objects.hash(entity, simpleName, alias);
1068+
return Objects.hash(entity, className, alias);
10711069
}
10721070

10731071
@Override
10741072
public String toString() {
1075-
return "Entity[" + "entity=" + entity + ", " + "simpleName=" + simpleName + ", " + "alias=" + alias + ']';
1073+
return "Entity[" + "entity=" + entity + ", " + "className=" + className + ", " + "alias=" + alias + ']';
10761074
}
10771075

10781076
}

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpqlQueryBuilderUnitTests.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,16 @@ void entity() {
7272
Entity entity = JpqlQueryBuilder.entity(Order.class);
7373

7474
assertThat(entity.getAlias()).isEqualTo("o");
75-
assertThat(entity.getEntity()).isEqualTo(Order.class.getName());
76-
assertThat(entity.getName()).isEqualTo(Order.class.getSimpleName());
75+
assertThat(entity.getName()).isEqualTo(Order.class.getName());
76+
}
77+
78+
@Test // GH-4032
79+
void considersEntityName() {
80+
81+
Entity entity = JpqlQueryBuilder.entity(Product.class);
82+
83+
assertThat(entity.getAlias()).isEqualTo("p");
84+
assertThat(entity.getName()).isEqualTo("my_product");
7785
}
7886

7987
@Test // GH-3588
@@ -266,7 +274,7 @@ static class Person {
266274
String name;
267275
}
268276

269-
@jakarta.persistence.Entity
277+
@jakarta.persistence.Entity(name = "my_product")
270278
static class Product {
271279

272280
@Id Long id;

0 commit comments

Comments
 (0)