HHH-4689 Make sure @OrderBy supports dotted notation to point to embedded properties
git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@18434 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
parent
a96f7bf729
commit
9ef2317e28
|
@ -368,6 +368,54 @@ public class BinderHelper {
|
||||||
return property;
|
return property;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the property by path in a recursive way
|
||||||
|
*/
|
||||||
|
public static Property findPropertyByName(Component component, String propertyName) {
|
||||||
|
Property property = null;
|
||||||
|
try {
|
||||||
|
if ( propertyName == null
|
||||||
|
|| propertyName.length() == 0) {
|
||||||
|
// Do not expect to use a primary key for this case
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
StringTokenizer st = new StringTokenizer( propertyName, ".", false );
|
||||||
|
while ( st.hasMoreElements() ) {
|
||||||
|
String element = (String) st.nextElement();
|
||||||
|
if ( property == null ) {
|
||||||
|
property = component.getProperty( element );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ( !property.isComposite() ) return null;
|
||||||
|
property = ( (Component) property.getValue() ).getProperty( element );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (MappingException e) {
|
||||||
|
try {
|
||||||
|
//if we do not find it try to check the identifier mapper
|
||||||
|
if ( component.getOwner().getIdentifierMapper() == null ) return null;
|
||||||
|
StringTokenizer st = new StringTokenizer( propertyName, ".", false );
|
||||||
|
while ( st.hasMoreElements() ) {
|
||||||
|
String element = (String) st.nextElement();
|
||||||
|
if ( property == null ) {
|
||||||
|
property = component.getOwner().getIdentifierMapper().getProperty( element );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ( !property.isComposite() ) return null;
|
||||||
|
property = ( (Component) property.getValue() ).getProperty( element );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (MappingException ee) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return property;
|
||||||
|
}
|
||||||
|
|
||||||
public static String getRelativePath(PropertyHolder propertyHolder, String propertyName) {
|
public static String getRelativePath(PropertyHolder propertyHolder, String propertyName) {
|
||||||
if ( propertyHolder == null ) return propertyName;
|
if ( propertyHolder == null ) return propertyName;
|
||||||
String path = propertyHolder.getPath();
|
String path = propertyHolder.getPath();
|
||||||
|
|
|
@ -1031,7 +1031,7 @@ public abstract class CollectionBinder {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
|
||||||
for (String property : properties) {
|
for (String property : properties) {
|
||||||
Property p = component.getProperty( property );
|
Property p = BinderHelper.findPropertyByName( component, property );
|
||||||
if ( p == null ) {
|
if ( p == null ) {
|
||||||
throw new AnnotationException(
|
throw new AnnotationException(
|
||||||
"property from @OrderBy clause not found: "
|
"property from @OrderBy clause not found: "
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
package org.hibernate.test.annotations.collectionelement;
|
||||||
|
|
||||||
|
import javax.persistence.Embeddable;
|
||||||
|
|
||||||
|
@Embeddable
|
||||||
|
public class Bug {
|
||||||
|
|
||||||
|
private String description;
|
||||||
|
private Person reportedBy;
|
||||||
|
private String summary;
|
||||||
|
|
||||||
|
public String getSummary() {
|
||||||
|
return summary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSummary(String summary) {
|
||||||
|
this.summary = summary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Person getReportedBy() {
|
||||||
|
return reportedBy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setReportedBy(Person reportedBy) {
|
||||||
|
this.reportedBy = reportedBy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription(){
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package org.hibernate.test.annotations.collectionelement;
|
||||||
|
|
||||||
|
import javax.persistence.ElementCollection;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.OrderBy;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "serial"})
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class BugSystem {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@ElementCollection
|
||||||
|
@OrderBy("reportedBy.lastName ASC,reportedBy.firstName ASC,summary")
|
||||||
|
private Set<Bug> bugs;
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Bug> getBugs() {
|
||||||
|
return bugs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBugs(Set<Bug> bugs) {
|
||||||
|
this.bugs = bugs;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -5,7 +5,6 @@ import org.hibernate.Session;
|
||||||
import org.hibernate.Transaction;
|
import org.hibernate.Transaction;
|
||||||
import org.hibernate.test.annotations.TestCase;
|
import org.hibernate.test.annotations.TestCase;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
@ -53,10 +52,62 @@ public class OrderByTest extends TestCase {
|
||||||
s.close();
|
s.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testOrderByWithDottedNotation() throws Exception {
|
||||||
|
Session s = openSession();
|
||||||
|
Transaction tx = s.beginTransaction();
|
||||||
|
|
||||||
|
BugSystem bs = new BugSystem();
|
||||||
|
HashSet<Bug> set = new HashSet<Bug>();
|
||||||
|
|
||||||
|
Bug bug = new Bug();
|
||||||
|
bug.setDescription("JPA-2 locking");
|
||||||
|
bug.setSummary("JPA-2 impl locking");
|
||||||
|
Person p = new Person();
|
||||||
|
p.setFirstName("Scott");
|
||||||
|
p.setLastName("Marlow");
|
||||||
|
bug.setReportedBy(p);
|
||||||
|
set.add(bug);
|
||||||
|
|
||||||
|
bug = new Bug();
|
||||||
|
bug.setDescription("JPA-2 annotations");
|
||||||
|
bug.setSummary("JPA-2 impl annotations");
|
||||||
|
p = new Person();
|
||||||
|
p.setFirstName("Emmanuel");
|
||||||
|
p.setLastName("Bernard");
|
||||||
|
bug.setReportedBy(p);
|
||||||
|
set.add(bug);
|
||||||
|
|
||||||
|
bug = new Bug();
|
||||||
|
bug.setDescription("Implement JPA-2 criteria");
|
||||||
|
bug.setSummary("JPA-2 impl criteria");
|
||||||
|
p = new Person();
|
||||||
|
p.setFirstName("Steve");
|
||||||
|
p.setLastName("Ebersole");
|
||||||
|
bug.setReportedBy(p);
|
||||||
|
set.add(bug);
|
||||||
|
|
||||||
|
bs.setBugs(set);
|
||||||
|
s.persist(bs);
|
||||||
|
tx.commit();
|
||||||
|
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
s.clear();
|
||||||
|
bs = (BugSystem) s.get(BugSystem.class,bs.getId());
|
||||||
|
Assert.assertTrue("has three bugs", bs.getBugs().size() == 3);
|
||||||
|
Iterator iter = bs.getBugs().iterator();
|
||||||
|
Assert.assertEquals( "Emmanuel", ((Bug)iter.next()).getReportedBy().getFirstName() );
|
||||||
|
Assert.assertEquals( "Steve", ((Bug)iter.next()).getReportedBy().getFirstName() );
|
||||||
|
Assert.assertEquals( "Scott", ((Bug)iter.next()).getReportedBy().getFirstName() );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
protected Class[] getMappings() {
|
protected Class[] getMappings() {
|
||||||
return new Class[] {
|
return new Class[] {
|
||||||
Products.class,
|
Products.class,
|
||||||
Widgets.class
|
Widgets.class,
|
||||||
|
BugSystem.class
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
package org.hibernate.test.annotations.collectionelement;
|
||||||
|
|
||||||
|
import javax.persistence.Embeddable;
|
||||||
|
|
||||||
|
@Embeddable
|
||||||
|
public class Person {
|
||||||
|
|
||||||
|
String lastName;
|
||||||
|
String firstName;
|
||||||
|
|
||||||
|
public String getLastName() {
|
||||||
|
return lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastName(String lastName) {
|
||||||
|
this.lastName = lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFirstName() {
|
||||||
|
return firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFirstName(String firstName) {
|
||||||
|
this.firstName = firstName;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue