Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EclipseLink/UserGuide/JPA/Basic JPA Development/Mapping/Additional Criteria"

 
(43 intermediate revisions by 2 users not shown)
Line 7: Line 7:
 
|apis=
 
|apis=
 
*[http://www.eclipse.org/eclipselink/api/latest/org/eclipse/persistence/annotations/AdditionalCriteria.html @AdditionalCriteria]
 
*[http://www.eclipse.org/eclipselink/api/latest/org/eclipse/persistence/annotations/AdditionalCriteria.html @AdditionalCriteria]
 +
|nativeapi=y
 +
|nativeapis=
 
*[http://www.eclipse.org/eclipselink/api/latest//org/eclipse/persistence/descriptors/DescriptorQueryManager.html DescriptorQueryManager]
 
*[http://www.eclipse.org/eclipselink/api/latest//org/eclipse/persistence/descriptors/DescriptorQueryManager.html DescriptorQueryManager]
 
*[http://www.eclipse.org/eclipselink/api/latest///org/eclipse/persistence/expressions/Expression.html Expression]
 
*[http://www.eclipse.org/eclipselink/api/latest///org/eclipse/persistence/expressions/Expression.html Expression]
 
}}
 
}}
  
=Additional Criteria=
+
=@AdditionalCriteria=
  
You can define additional criteria for queries defined for entities or mapped superclasses, using the <tt>@AdditionalCriteria</tt> annotation or the <tt><additional-criteria></tt> element. Additional criteria can provide an additional filtering mechanism for queries. This feature can be useful for multi-tenancy, soft deletes, history, shared tables, and temporal filtering.
+
Use <tt>@AdditionalCriteria</tt> to define parameterized views on data. You can define additional criteria on entities or mapped superclasses. When specified at the mapped superclass level, the additional criteria definition applies to all inheriting entities, unless those entities define their own additional criteria, in which case those defined for the mapped superclass are ignored.
  
When specified at the mapped superclass level, the additional criteria definition applies to all inheriting entities, unless those entities define their own additional criteria, in which case those defined for the mapped superclass are ignored.
+
Additional criteria can provide an additional filtering mechanism for queries. This filtering option, for example, allows you to use an existing additional JOIN expression defined for the entity or mapped superclass and allows you to pass parameters to it.  
  
This filtering option, for example, allows you to use an existing additional JOIN expression defined for the entity or mapped superclass and allows you to pass parameters to it.  
+
{{EclipseLink_AttributeTable
 +
|caption=@AdditionalCriteria Attributes
 +
|content=<tr>
 +
<td>'''<tt>value</tt>'''</td>
 +
<td>The JPQL fragment to use as the additional criteria.</td>
 +
<td></td>
 +
<td>Yes</td>
 +
</tr>
 +
}}
  
Additional criteria parameters can also be set through properties on the entity manager factory or on an entity manager. When set on the entity manager, the properties must be set before any query execution and should not be changed for the lifespan of that entity manager. Properties set on the entity manager override identically named properties set on the entity manager factory.
 
  
Additional criteria are not supported with any native queries.
+
==Defining Additional Criteria==
  
The additional criteria definition supports any valid JPQL string and must use <tt>this</tt> as an alias to form the additional criteria. For example,
+
Set additional criteria parameters through properties on the entity manager factory or on the entity manager. Properties set on the entity manager override identically named properties set on the entity manager factory. Properties must be set on an entity manager before executing a query. Do not change the properties for the lifespan of the entity manager.  
  
<source lang="java">
+
Additional criteria are not supported with native queries.
@Entity
+
@AdditionalCriteria("this.employees.hiredate = :EMPLOYEES_HIREDATE and this.employees.status = :EMPLOYEES_STATUS")
+
public class Status {...}
+
</source>
+
 
+
You can specify additional criteria using the <tt>@AdditionalCriteria</tt> annotation or the <tt>&lt;additional-criteria&gt;</tt> element, as shown in the following examples.
+
 
+
==Examples==
+
  
The following is a simple example using the <tt>@AdditionalCriteria</tt> annotation:
+
Specify additional criteria using the <tt>@AdditionalCriteria</tt> annotation or the <tt>&lt;additional-criteria&gt;</tt> element. The additional criteria definition supports any valid JPQL string and must use <tt>this</tt> as an alias to form the additional criteria. For example,
  
 
<source lang="java">
 
<source lang="java">
Line 41: Line 42:
 
</source>
 
</source>
  
 +
The following example shows additional criteria defined for the entity <tt>Employee</tt> and then shows the parameters for the additional criteria set on the entity manager.
  
The following shows a more complete example of how to use this feature.
+
Define additional criteria on <tt>Employee</tt>, as follows,...
 
+
With the additional criteria defined for the <tt>Employee</tt> entity...
+
  
 
<source lang="java">
 
<source lang="java">
Line 55: Line 55:
 
</source>
 
</source>
  
...setting the following property on the <tt>EntityManager</tt> will return all employees of "MyCompany."
+
...then set the property on the <tt>EntityManager</tt>. This example returns all employees of <tt>MyCompany</tt>.
  
 
<source lang="java">
 
<source lang="java">
Line 62: Line 62:
  
  
The following is a simple example using the <tt><additional-criteria></tt> element:
+
The following example shows the <tt><additional-criteria></tt> element used in the <tt>eclipselink-orm.xml</tt> descriptor:
  
 +
======'' Example: additional-criteria Element''======
 
<source lang="xml">
 
<source lang="xml">
 
<additional-criteria>
 
<additional-criteria>
 
   <criteria>this.address.city IS NOT NULL</criteria>
 
   <criteria>this.address.city IS NOT NULL</criteria>
</additional-criteria&>
+
</additional-criteria>
 
</source>
 
</source>
  
 +
==Uses for Additional Criteria==
 +
Uses for additional criteria include:
 +
*[[#Multitenancy Example|Multitenancy]]
 +
*[[#Soft Delete Example|Soft deletes]]
 +
*[[#History Example|Data history]]
 +
*[[#Temporal Filtering Example|Temporal filtering]]
 +
*[[#Shared Table Example|Shared tables]]
  
 +
====Multitenancy Example====
 +
 +
In a multitenancy environment, tenants (users, clients, organizations, applications) can share database tables, but the views on the data are restricted so that tenants have access only to their own data. You can use additional criteria to configure such restrictions. 
 +
 +
=====Multitenancy Example 1 =====
 +
 +
The following example restricts the data for a “Billing” client, such as a billing application or billing organization:
 +
<source lang="java">
 +
@AdditionalCriteria("this.tenant = 'Billing'")
 +
</source>
 +
 +
=====Multitenancy Example 2 =====
 +
 +
The following example could be used in an application used by multiple tenants at the same time. The additional criteria is defined as:
 +
 +
<source lang="java">
 +
@AdditionalCriteria("this.tenant = :tenant")
 +
</source>
 +
 +
When the tenant acquires its <tt>EntityManagerFactory</tt> or <tt>EntityManager</tt>, the persistence/entity manager property <tt>tenant</tt> is set to the name of the tenant acquiring it. For example,
 +
 +
<source lang="java">
 +
Map properties = new HashMap();
 +
properties.put("tenant", "ACME");
 +
EntityManagerFactory emf = Persistence.createEntityManagerFactory(properties);
 +
</source>
 +
 +
or
 +
 +
<source lang="java">
 +
Map properties = new HashMap();
 +
properties.put("tenant", "ACME");
 +
EntityManager em = factory.createEntityManager(properties);
 +
</source>
 +
 +
====Soft Delete Example====
 +
 +
The following example filters data that is marked as deleted (but which still exists in the table) from a query:
 +
 +
<source lang="java">
 +
@AdditionalCriteria("this.isDeleted = false")
 +
</source>
 +
 +
====Data History Example====
 +
<!--We have specific history support, but if the user just wants something simpler or more generic they can use criteria. -->
 +
 +
The following example returns the current data from a query, thus filtering out any out-of-date data, for example data stored in a history table.
 +
 +
<source lang="java">
 +
@AdditionalCriteria("this.endDate is null")
 +
</source>
 +
 +
Note: EclipseLink also provides specific history support, via [http://www.eclipse.org/eclipselink/api/latest/org/eclipse/persistence/history/HistoryPolicy.html <tt>HistoryPolicy</tt> ]. See [http://wiki.eclipse.org/EclipseLink/Examples/JPA/History Tracking Changes Using History Policy].
 +
 +
====Temporal Filtering Example====
 +
 +
The following example filters on a specific date:
 +
 +
<source lang="java">
 +
@AdditionalCriteria("this.startDate <= :viewDate and this.endDate >= :viewDate")
 +
</source>
 +
 +
====Shared Table Example====
 +
 +
For a shared table, there may be inheritance in the table but not in the object model.
 +
For example, a <tt>SavingsAccount</tt> class may be mapped to an ACCOUNT table, but the ACCOUNT table contains both savings account data (SAVINGS) and checking account (CHECKING) data. You can use additional criteria to filter out the checking account data.
 +
 +
<!--
 +
<source lang="java">
 +
@AdditionalCriteria("this.savings=:SAVINGS")
 +
</source>
 +
-->
  
 
{{EclipseLink_JPA
 
{{EclipseLink_JPA
|previous= [[EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Criteria|Criteria]]
+
|previous= [[EclipseLink/UserGuide/JPA/Basic_JPA_Development/Mapping/Relationship_Mappings/Collection_Mappings/ManyToMany|Many To Many]]
|next=[[EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Native|Native]]
+
|next= [[EclipseLink/UserGuide/JPA/Basic_JPA_Development/Mapping/Locking|Locking]]
|up=[[EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying|Querying]]
+
|up=[[EclipseLink/UserGuide/JPA/Basic_JPA_Development/Mapping|Configuring Mapping]]
 
|version=2.2.0 DRAFT}}
 
|version=2.2.0 DRAFT}}

Latest revision as of 13:51, 14 June 2011

EclipseLink JPA

Eclipselink-logo.gif
EclipseLink
Website
Download
Community
Mailing ListForumsIRCmattermost
Issues
OpenHelp WantedBug Day
Contribute
Browse Source


@AdditionalCriteria

Use @AdditionalCriteria to define parameterized views on data. You can define additional criteria on entities or mapped superclasses. When specified at the mapped superclass level, the additional criteria definition applies to all inheriting entities, unless those entities define their own additional criteria, in which case those defined for the mapped superclass are ignored.

Additional criteria can provide an additional filtering mechanism for queries. This filtering option, for example, allows you to use an existing additional JOIN expression defined for the entity or mapped superclass and allows you to pass parameters to it.

@AdditionalCriteria Attributes
Attribute Description Default Required?
value The JPQL fragment to use as the additional criteria. Yes


Defining Additional Criteria

Set additional criteria parameters through properties on the entity manager factory or on the entity manager. Properties set on the entity manager override identically named properties set on the entity manager factory. Properties must be set on an entity manager before executing a query. Do not change the properties for the lifespan of the entity manager.

Additional criteria are not supported with native queries.

Specify additional criteria using the @AdditionalCriteria annotation or the <additional-criteria> element. The additional criteria definition supports any valid JPQL string and must use this as an alias to form the additional criteria. For example,

@AdditionalCriteria("this.address.city IS NOT NULL")

The following example shows additional criteria defined for the entity Employee and then shows the parameters for the additional criteria set on the entity manager.

Define additional criteria on Employee, as follows,...

package model;
 
@AdditionalCriteria("this.company=:COMPANY")
public class Employee {
  ...
}

...then set the property on the EntityManager. This example returns all employees of MyCompany.

entityManager.setProperty("COMPANY", "MyCompany");


The following example shows the <additional-criteria> element used in the eclipselink-orm.xml descriptor:

Example: additional-criteria Element
<additional-criteria>
  <criteria>this.address.city IS NOT NULL</criteria>
</additional-criteria>

Uses for Additional Criteria

Uses for additional criteria include:

Multitenancy Example

In a multitenancy environment, tenants (users, clients, organizations, applications) can share database tables, but the views on the data are restricted so that tenants have access only to their own data. You can use additional criteria to configure such restrictions.

Multitenancy Example 1

The following example restricts the data for a “Billing” client, such as a billing application or billing organization:

@AdditionalCriteria("this.tenant = 'Billing'")
Multitenancy Example 2

The following example could be used in an application used by multiple tenants at the same time. The additional criteria is defined as:

@AdditionalCriteria("this.tenant = :tenant")

When the tenant acquires its EntityManagerFactory or EntityManager, the persistence/entity manager property tenant is set to the name of the tenant acquiring it. For example,

Map properties = new HashMap();
properties.put("tenant", "ACME");
EntityManagerFactory emf = Persistence.createEntityManagerFactory(properties);

or

Map properties = new HashMap();
properties.put("tenant", "ACME");
EntityManager em = factory.createEntityManager(properties);

Soft Delete Example

The following example filters data that is marked as deleted (but which still exists in the table) from a query:

@AdditionalCriteria("this.isDeleted = false")

Data History Example

The following example returns the current data from a query, thus filtering out any out-of-date data, for example data stored in a history table.

@AdditionalCriteria("this.endDate is null")

Note: EclipseLink also provides specific history support, via HistoryPolicy . See Tracking Changes Using History Policy.

Temporal Filtering Example

The following example filters on a specific date:

@AdditionalCriteria("this.startDate <= :viewDate and this.endDate >= :viewDate")

Shared Table Example

For a shared table, there may be inheritance in the table but not in the object model. For example, a SavingsAccount class may be mapped to an ACCOUNT table, but the ACCOUNT table contains both savings account data (SAVINGS) and checking account (CHECKING) data. You can use additional criteria to filter out the checking account data.


Eclipselink-logo.gif
Version: 2.2.0 DRAFT
Other versions...

Back to the top