Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -154,10 +154,7 @@ public <X> ManagedDomainType<X> managedType(String typeName) {
return null;
}
final ManagedDomainType<?> managedType = managedTypeByName.get( entityName );
if ( !( managedType instanceof EntityDomainType<?> entityDomainType ) ) {
return null;
}
return entityDomainType;
return managedType instanceof EntityDomainType<?> entityDomainType ? entityDomainType : null;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.processor.test.data.processingorder;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;

@Entity
public class Post {
@Id
Integer id;

String posterId;

@ManyToOne
protected Topic topic;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.processor.test.data.processingorder;

import jakarta.data.repository.DataRepository;
import jakarta.data.repository.Query;
import jakarta.data.repository.Repository;

import java.util.List;

@Repository
public interface PostRepository extends DataRepository<Post, Integer> {

@Query("from Post p where p.topic=:topic")
List<Post> getPostsByTopic(Topic topic);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.processor.test.data.processingorder;

import org.hibernate.processor.test.util.CompilationTest;
import org.hibernate.processor.test.util.WithClasses;
import org.junit.Test;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import static org.hibernate.processor.test.util.TestUtil.assertMetamodelClassGeneratedFor;
import static org.hibernate.processor.test.util.TestUtil.assertPresenceOfMethodInMetamodelFor;
import static org.hibernate.processor.test.util.TestUtil.getMethodFromMetamodelFor;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;

public class ProcessingOrderTest extends CompilationTest {
@Test
@WithClasses({Post.class, PostRepository.class, Topic.class})
public void test() {
assertMetamodelClassGeneratedFor( PostRepository.class );

assertPresenceOfMethodInMetamodelFor( PostRepository.class, "getPostsByTopic", Topic.class );
final Method method = getMethodFromMetamodelFor( PostRepository.class, "getPostsByTopic", Topic.class );
assertEquals( Topic.class, method.getParameterTypes()[0] );
if ( method.getGenericReturnType() instanceof ParameterizedType parameterizedType ) {
assertEquals( List.class, parameterizedType.getRawType() );
assertEquals( Post.class, parameterizedType.getActualTypeArguments()[0] );
}
else {
fail();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.processor.test.data.processingorder;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OrderBy;

import java.util.List;

@Entity
public class Topic {
@Id
Integer id;

@OneToMany(mappedBy = "topic", targetEntity = Post.class)
@OrderBy
private List<Post> posts;

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeKind;
Expand All @@ -35,7 +34,6 @@
import static java.lang.Boolean.parseBoolean;
import static java.util.Collections.emptyList;
import static org.hibernate.internal.util.collections.ArrayHelper.EMPTY_STRING_ARRAY;
import static org.hibernate.processor.validation.ProcessorSessionFactory.findEntityByUnqualifiedName;

/**
* @author Max Andersen
Expand Down Expand Up @@ -533,27 +531,6 @@ private void addEnumValue(String qualifiedTypeName, String value) {
enumTypesByValue.computeIfAbsent( value, s -> new TreeSet<>() ).add( qualifiedTypeName );
}

public @Nullable TypeElement entityType(String entityName) {
final Elements elementUtils = getElementUtils();
final String qualifiedName = qualifiedNameForEntityName(entityName);
if ( qualifiedName != null ) {
return elementUtils.getTypeElement(qualifiedName);
}
TypeElement symbol =
findEntityByUnqualifiedName( entityName,
elementUtils.getModuleElement("") );
if ( symbol != null ) {
return symbol;
}
for ( ModuleElement module : elementUtils.getAllModuleElements() ) {
symbol = findEntityByUnqualifiedName( entityName, module );
if ( symbol != null ) {
return symbol;
}
}
return null;
}

public void setIndexing(boolean index) {
this.indexing = index;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ public class HibernateProcessor extends AbstractProcessor {

private static final boolean ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS = false;

// dupe of ProcessorSessionFactory.ENTITY_INDEX for reasons of modularity
public static final String ENTITY_INDEX = "entity.index";

private Context context;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ private void handleNamedQuery(AnnotationMirror mirror, boolean checkHql) {
final AnnotationValue annotationValue = getAnnotationValue( mirror, "resultClass" );
final String resultType = annotationValue != null
? annotationValue.getValue().toString()
: resultType( selectStatement, context );
: resultType( selectStatement );
putMember( name,
new NamedQueryMethod(
this,
Expand All @@ -128,7 +128,7 @@ private void handleNamedQuery(AnnotationMirror mirror, boolean checkHql) {
);
}
if ( getAnnotationValue( mirror, "resultClass" ) == null ) {
final String resultType = resultType( selectStatement, context );
final String resultType = resultType( selectStatement );
if ( resultType != null ) {
putMember( "QUERY_" + name,
new TypedMetaAttribute( this, name, "QUERY_", resultType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2723,11 +2723,12 @@ private boolean checkReturnedEntity(EntityDomainType<?> model, TypeMirror return
if ( returnType.getKind() == TypeKind.DECLARED ) {
final DeclaredType declaredType = (DeclaredType) returnType;
final TypeElement typeElement = (TypeElement) declaredType.asElement();
final AnnotationMirror mirror = getAnnotationMirror(typeElement, ENTITY );
if ( mirror != null ) {
final String entityName = entityName(declaredType, mirror);
return model.getHibernateEntityName().equals( entityName );
}
// final AnnotationMirror mirror = getAnnotationMirror(typeElement, ENTITY );
// if ( mirror != null ) {
// message( element, "entity return type '" + typeElement.getQualifiedName()
// + "' was not annotated '@Entity'", Diagnostic.Kind.WARNING );
// }
return typeElement.getQualifiedName().contentEquals( model.getHibernateEntityName() );
}
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +4,33 @@
*/
package org.hibernate.processor.util;

import org.hibernate.processor.Context;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.query.criteria.JpaEntityJoin;
import org.hibernate.query.criteria.JpaRoot;
import org.hibernate.query.criteria.JpaSelection;
import org.hibernate.query.sqm.tree.select.SqmSelectClause;
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
import org.hibernate.query.sqm.tree.select.SqmSelectableNode;

import javax.lang.model.element.TypeElement;
import java.util.List;

public final class SqmTypeUtils {
private SqmTypeUtils() {
}

public static String resultType(SqmSelectStatement<?> selectStatement, Context context) {
final String javaTypeName = selectStatement.getSelection().getJavaTypeName();
if ( javaTypeName != null ) {
return javaTypeName;
public static String resultType(SqmSelectStatement<?> selectStatement) {
final JpaSelection<?> selection = selectStatement.getSelection();
if (selection instanceof SqmSelectClause from) {
return from.getSelectionItems().size() > 1
? "Object[]"
: from.getSelectionItems().get(0).getJavaTypeName();
}
else if (selection instanceof JpaRoot<?> root) {
return root.getJavaTypeName();
}
else if (selection instanceof JpaEntityJoin<?, ?> join) {
return join.getJavaTypeName();
}
else {
final List<SqmSelectableNode<?>> items =
selectStatement.getQuerySpec().getSelectClause().getSelectionItems();
final SqmExpressible<?> expressible;
if ( items.size() == 1 && (expressible = items.get( 0 ).getExpressible()) != null ) {
final String typeName = expressible.getTypeName();
final TypeElement entityType = context.entityType( typeName );
return entityType == null ? typeName : entityType.getQualifiedName().toString();
}
else {
return "Object[]";
}
return selection.getJavaTypeName();
}
}

}
Loading
Loading