You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by Chris Hinshaw <ch...@gmail.com> on 2013/03/19 20:13:10 UTC

CriteriaQuery on mapped-superclass does not work with orm.xml

I have been switching code to use the orm.xml from the annotations for code cleanliness and better documentation. As I was doing this I broke the ability to query an MappedSuperClass. I know what this is not a jpa 2.0 specification but this functionality does work with openjpa.  I have tried the newest 2.2.1 version and am still having the same problem. I did notice that in the orm.xsd for 2.0 mapped-superclass does not support the <inheritance> tag which may be causing my problem since I am unable to specify that the strategy will be TABLE_PER_CLASS and this may be a prerequisite? Any ideas?


The following are my base class and the class that extends AnalyticsOperation. 

	<mapped-superclass class="com.hp.vf.server.domain.AnalyticsOperation"
		access="FIELD">

		<attributes>
			<basic name="isPublic" />
			<basic name="name" />
			<basic name="description" />

			<one-to-many name="inputs"
				target-entity="com.hp.vf.server.domain.AnalyticsOperationInput"
				fetch="LAZY" orphan-removal="true">
				<order-column />
				<cascade>
					<cascade-all />
				</cascade>
			</one-to-many>

			<one-to-many name="outputs" target-entity="com.hp.vf.server.domain.metric.Metric"
				fetch="LAZY" orphan-removal="true">
				<order-column />
				<cascade>
					<cascade-all />
				</cascade>
			</one-to-many>

			<one-to-one name="owner" fetch="LAZY">
				<cascade>
					<cascade-persist />
					<cascade-merge />
				</cascade>
			</one-to-one>
		</attributes>
	</mapped-superclass>

	<entity class="com.hp.vf.server.domain.RAnalyticsOperation"
		access="FIELD">
		<inheritance strategy="TABLE_PER_CLASS" />
		<attributes>
			<basic name="code" fetch="LAZY">
				<lob />
			</basic>
		</attributes>
	</entity>



In this class the clazz is the AnalyticsOperation.class from above.
    	
    	EntityManager entityManager = ThreadLocalPersistenceManager.getEntityManager();
		CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
		CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(clazz);
		
		Root<T> root = criteriaQuery.from(clazz);

		List<Predicate>  conditions = new ArrayList<Predicate>();

		if(searchColumn != null && (searchText != null && searchText.trim().length() > 0 )){
			conditions.add(criteriaBuilder.like(root.<String> get(searchColumn), "%" + searchText.trim() + "%"));
		}
	...
	}


But when executing I get this exception. The DaoBase.java:141 is "Root<T> root = criteriaQuery.from(clazz);"

java.lang.IllegalArgumentException: "class com.hp.vf.server.domain.AnalyticsOperation" categorized as "MAPPED_SUPERCLASS" should be a "ENTITY"
	at org.apache.openjpa.persistence.meta.MetamodelImpl.instantiate(MetamodelImpl.java:243)
	at org.apache.openjpa.persistence.meta.MetamodelImpl.find(MetamodelImpl.java:224)
	at org.apache.openjpa.persistence.meta.MetamodelImpl.entity(MetamodelImpl.java:126)
	at org.apache.openjpa.persistence.criteria.CriteriaQueryImpl.from(CriteriaQueryImpl.java:345)
	at com.hp.vf.server.dao.DaoBase.search(DaoBase.java:141)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)


Thanks,
Chris

Re: CriteriaQuery on mapped-superclass does not work with orm.xml

Posted by Pinaki Poddar <pp...@apache.org>.
JPA Specification version 2.0
Section 2.11.2 : Mapped Superclasses
    "A mapped superclass, unlike an entity, is not queryable and must not be
passed as an argument to
EntityManager or Query operations"

  Consider using an abstract class instead.



-----
Pinaki Poddar
Chair, Apache OpenJPA Project
--
View this message in context: http://openjpa.208410.n2.nabble.com/CriteriaQuery-on-mapped-superclass-does-not-work-with-orm-xml-tp7583185p7583260.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.