maqjav maqjav - 3 years ago 115
Java Question

Populate child bean with Transformers.aliasToBean in Hibernate

I have the next couple of beans:

Address {
String name;
String number;
String zipcode;
String town;
}

MyEntity {
Address address;
String value1;
String value2;
}


I'm trying to do the next Hibernate query:

private final List<String> propertiesDistinct = Arrays.asList("address.name");
private final List<String> properties = Arrays.asList("address.number",
"address.zipcode", "address.town")

ProjectionList projectionList = Projections.projectionList();

if (propertiesDistinct != null) {
ProjectionList projectionListDistinct = Projections.projectionList();
for (String propertyDistinct : propertiesDistinct)
projectionListDistinct.add(Projections.property(propertyDistinct).as(propertyDistinct));

projectionList.add(Projections.distinct(projectionListAgrupar));
}

if (properties != null)
for (String property : properties)
projectionList.add(Projections.property(property).as(property));
criterio.setProjection(projectionList);

// MORE FILTERS ON MyEntity FIELDS
//... criterio.add(Restrinctions...);

// I want to recover the results on my bean MyEntity so I don't have to create a new one
criterio.setResultTransformer(Transformers.aliasToBean(MyEntity.class));


Problem:

Caused by: org.hibernate.PropertyNotFoundException: Could not find setter for address.name on class com.entities.MyEntity


I understand that Hibernate is looking for something like:

public String getAddressName() {} // This should be in MyEntity


Instead of:

public String getName() {} // In my Address bean


Ideas about how can I fix this without creating a new bean?

Thanks!

Answer Source

I wrote a ResultTransformer that can fix your problem. It's name is AliasToBeanNestedResultTransformer, check it out on github.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download