diff --git a/src/docbkx/jpa.xml b/src/docbkx/jpa.xml index 03a21ba05..2dc8695fc 100644 --- a/src/docbkx/jpa.xml +++ b/src/docbkx/jpa.xml @@ -321,7 +321,7 @@ class ApplicationConfig { … where x.lastname = ?1 or x.firstname = ?2 - + Is,Equals @@ -346,7 +346,7 @@ class ApplicationConfig { … where x.age < ?1 - + LessThanEqual @@ -362,7 +362,7 @@ class ApplicationConfig { … where x.age > ?1 - + GreaterThanEqual @@ -496,15 +496,15 @@ class ApplicationConfig { … where x.active = false - + IgnoreCase findByFirstnameIgnoreCase - … where UPPER(x.firstame) = UPPER(?1) + … where UPPER(x.firstame) = + UPPER(?1) - @@ -748,6 +748,13 @@ public class User { the query string of a @Query annotation one can use the #{#entityName} Variable. + + The entityName can be customized via the + @Entity annotation. Customizations via + orm.xml are not supported for the SpEL + expressions. + + Using SpEL expressions in Repository query methods - entityName @@ -1067,7 +1074,7 @@ class UserManagementImpl implements UserManagement { none already running). The transaction configuration at the repositories will be neglected then as the outer transaction configuration determines the actual one used. Note that you will have to activate - <tx:annotation-driven /> or use + <tx:annotation-driven /> or use @EnableTransactionManagement explicitly to get annotation based configuration at facades working. The example above assumes you are using component scanning. diff --git a/src/main/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformation.java b/src/main/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformation.java index e6a922cc7..401941b0e 100644 --- a/src/main/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformation.java +++ b/src/main/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformation.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2013 the original author or authors. + * Copyright 2011-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import java.util.List; import java.util.Set; import javax.persistence.IdClass; +import javax.persistence.metamodel.EntityType; import javax.persistence.metamodel.IdentifiableType; import javax.persistence.metamodel.ManagedType; import javax.persistence.metamodel.Metamodel; @@ -48,6 +49,7 @@ public class JpaMetamodelEntityInformation extends J private final IdMetadata idMetadata; private final SingularAttribute versionAttribute; private final Metamodel metamodel; + private final String entityName; /** * Creates a new {@link JpaMetamodelEntityInformation} for the given domain class and {@link Metamodel}. @@ -63,11 +65,12 @@ public class JpaMetamodelEntityInformation extends J this.metamodel = metamodel; ManagedType type = metamodel.managedType(domainClass); - if (type == null) { throw new IllegalArgumentException("The given domain class can not be found in the given Metamodel!"); } + this.entityName = type instanceof EntityType ? ((EntityType) type).getName() : null; + if (!(type instanceof IdentifiableType)) { throw new IllegalArgumentException("The given domain class does not contain an id attribute!"); } @@ -76,6 +79,15 @@ public class JpaMetamodelEntityInformation extends J this.versionAttribute = findVersionAttribute(type); } + /* + * (non-Javadoc) + * @see org.springframework.data.jpa.repository.support.JpaEntityInformationSupport#getEntityName() + */ + @Override + public String getEntityName() { + return entityName != null ? entityName : super.getEntityName(); + } + /** * Returns the version attribute of the given {@link ManagedType} or {@literal null} if none available. * @@ -126,9 +138,7 @@ public class JpaMetamodelEntityInformation extends J /* * (non-Javadoc) - * - * @see - * org.springframework.data.repository.support.EntityInformation#getIdType() + * @see org.springframework.data.repository.core.EntityInformation#getIdType() */ @SuppressWarnings("unchecked") public Class getIdType() { @@ -137,9 +147,7 @@ public class JpaMetamodelEntityInformation extends J /* * (non-Javadoc) - * - * @see org.springframework.data.jpa.repository.support.JpaEntityMetadata# - * getIdAttribute() + * @see org.springframework.data.jpa.repository.support.JpaEntityInformation#getIdAttribute() */ public SingularAttribute getIdAttribute() { return idMetadata.getSimpleIdAttribute(); diff --git a/src/test/java/org/springframework/data/jpa/domain/sample/Role.java b/src/test/java/org/springframework/data/jpa/domain/sample/Role.java index 1a9da0c6b..604291031 100644 --- a/src/test/java/org/springframework/data/jpa/domain/sample/Role.java +++ b/src/test/java/org/springframework/data/jpa/domain/sample/Role.java @@ -36,9 +36,7 @@ public class Role { /** * Creates a new instance of {@code Role}. */ - public Role() { - - } + public Role() {} /** * Creates a new preconfigured {@code Role}. @@ -46,7 +44,6 @@ public class Role { * @param name */ public Role(final String name) { - this.name = name; } @@ -60,6 +57,13 @@ public class Role { return id; } + /** + * @return the name + */ + public String getName() { + return name; + } + /* * (non-Javadoc) * diff --git a/src/test/java/org/springframework/data/jpa/repository/RoleRepositoryIntegrationTests.java b/src/test/java/org/springframework/data/jpa/repository/RoleRepositoryIntegrationTests.java index 8970d9a1d..e9db15183 100644 --- a/src/test/java/org/springframework/data/jpa/repository/RoleRepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/RoleRepositoryIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,14 +32,14 @@ import org.springframework.transaction.annotation.Transactional; * Integration tests for {@link RoleRepository}. * * @author Oliver Gierke + * @author Thomas Darimont */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:application-context.xml" }) @Transactional public class RoleRepositoryIntegrationTests { - @Autowired - RoleRepository repository; + @Autowired RoleRepository repository; @Test public void createsRole() throws Exception { @@ -62,4 +62,40 @@ public class RoleRepositoryIntegrationTests { assertThat(repository.findOne(result.getId()), is(reference)); } + + /** + * @see DATAJPA-509 + */ + @Test + public void shouldUseExplicitlyConfiguredEntityNameInOrmXmlInCountQueries() { + + Role reference = new Role("ADMIN"); + repository.save(reference); + + assertThat(repository.count(), is(1L)); + } + + /** + * @see DATAJPA-509 + */ + @Test + public void shouldUseExplicitlyConfiguredEntityNameInOrmXmlInExistsQueries() { + + Role reference = new Role("ADMIN"); + reference = repository.save(reference); + + assertThat(repository.exists(reference.getId()), is(true)); + } + + /** + * @see DATAJPA-509 + */ + @Test + public void shouldUseExplicitlyConfiguredEntityNameInDerivedCountQueries() { + + Role reference = new Role("ADMIN"); + reference = repository.save(reference); + + assertThat(repository.countByName(reference.getName()), is(1L)); + } } diff --git a/src/test/java/org/springframework/data/jpa/repository/config/QueryLookupStrategyTests.java b/src/test/java/org/springframework/data/jpa/repository/config/QueryLookupStrategyTests.java index 737d03a0b..c320d4f63 100644 --- a/src/test/java/org/springframework/data/jpa/repository/config/QueryLookupStrategyTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/config/QueryLookupStrategyTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2008-2011 the original author or authors. + * Copyright 2008-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,22 +32,22 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * Integration test for XML configuration of {@link QueryLookupStrategy.Key}s. * * @author Oliver Gierke + * @author Thomas Darimont */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:config/lookup-strategies-context.xml") public class QueryLookupStrategyTests { - @Autowired - ApplicationContext context; + @Autowired ApplicationContext context; /** - * Assert that {@link QueryLookupStrategy#USE_DECLARED_QUERY} is being set on the factory if configured. + * Assert that {@link Key#CREATE_IF_NOT_FOUND} is being set on the factory if configured. */ @Test - public void assertUseDeclaredQuery() { + public void shouldUseExplicitlyConfiguredQueryLookUpStrategy() { JpaRepositoryFactoryBean factory = context.getBean("&roleRepository", JpaRepositoryFactoryBean.class); - assertEquals(Key.USE_DECLARED_QUERY, getField(factory, "queryLookupStrategyKey")); + assertEquals(Key.CREATE_IF_NOT_FOUND, getField(factory, "queryLookupStrategyKey")); } } diff --git a/src/test/java/org/springframework/data/jpa/repository/sample/RoleRepository.java b/src/test/java/org/springframework/data/jpa/repository/sample/RoleRepository.java index bb14f0af6..f34b54f86 100644 --- a/src/test/java/org/springframework/data/jpa/repository/sample/RoleRepository.java +++ b/src/test/java/org/springframework/data/jpa/repository/sample/RoleRepository.java @@ -27,6 +27,7 @@ import org.springframework.data.repository.CrudRepository; * Typing interface for {@code Role}. * * @author Oliver Gierke + * @author Thomas Darimont */ public interface RoleRepository extends CrudRepository { @@ -45,4 +46,9 @@ public interface RoleRepository extends CrudRepository { @Lock(LockModeType.READ) @QueryHints(@QueryHint(name = "foo", value = "bar")) Role findOne(Integer id); + + /** + * @see DATAJPA-509 + */ + long countByName(String name); } diff --git a/src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java b/src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java index 3eb89536c..a5d0fd2bb 100644 --- a/src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2013 the original author or authors. + * Copyright 2011-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.data.jpa.domain.AbstractPersistable; +import org.springframework.data.jpa.domain.sample.Role; import org.springframework.data.jpa.domain.sample.SampleWithIdClass; import org.springframework.data.jpa.domain.sample.SampleWithIdClassPK; import org.springframework.data.jpa.domain.sample.SampleWithPrimitiveId; @@ -49,6 +50,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * Integration tests for {@link JpaMetamodelEntityInformation}. * * @author Oliver Gierke + * @author Thomas Darimont */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({ "classpath:infrastructure.xml" }) @@ -155,6 +157,18 @@ public class JpaMetamodelEntityInformationIntegrationTests { assertThat(information.isNew(sample), is(false)); } + /** + * @see DATAJPA-509 + */ + @Test + public void jpaMetamodelEntityInformationShouldRespectExplicitlyConfiguredEntityNameFromOrmXml() { + + JpaEntityInformation info = new JpaMetamodelEntityInformation(Role.class, + em.getMetamodel()); + + assertThat(info.getEntityName(), is("ROLE")); + } + protected String getMetadadataPersitenceUnitName() { return "metadata"; } diff --git a/src/test/resources/META-INF/orm.xml b/src/test/resources/META-INF/orm.xml index 8bb0b959c..89cbea582 100644 --- a/src/test/resources/META-INF/orm.xml +++ b/src/test/resources/META-INF/orm.xml @@ -13,7 +13,7 @@ SELECT u FROM User u WHERE u.lastname = ?1 - + diff --git a/src/test/resources/config/lookup-strategies-context.xml b/src/test/resources/config/lookup-strategies-context.xml index 541a85a80..c484a76fc 100644 --- a/src/test/resources/config/lookup-strategies-context.xml +++ b/src/test/resources/config/lookup-strategies-context.xml @@ -9,7 +9,7 @@ - +