7

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!

4

5 に答える 5

20

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

于 2013-09-11T01:20:14.467 に答える
3

Githubで提供されるコードは問題なく動作しますがimport、休止状態の新しいバージョンに変更があります。以下の通りです。

org.hibernate.property.PropertyAccessorと取り換えるorg.hibernate.property.access.spi.PropertyAccess

org.hibernate.property.PropertyAccessorFactoryと取り換えるorg.hibernate.property.access.internal.PropertyAccessStrategyBasicImpl

したがって、コードを次のように変更する必要があります

PropertyAccessor accessor = PropertyAccessorFactory.getPropertyAccessor("property");
accessor.getSetter(resultClass, (String)subclassToAlias.get(subclass).get(2)).set(root, subObject, null);

PropertyAccess propertyAccess = PropertyAccessStrategyBasicImpl.INSTANCE.buildPropertyAccess(resultClass, (String)subclassToAlias.get(subclass).get(2));
propertyAccess.getSetter().set(root, subObject, null);
于 2016-03-04T06:05:02.273 に答える
1

のようなエイリアスを作成してcriterio.createAlias("address", "add");から、プロパティを のように編集してみてくださいArrays.asList("add.number","add.zipcode", "add.town")

お役に立てれば。

于 2013-09-10T08:16:08.997 に答える