2

У меня есть отношение «один ко многим» Владелец-> Собака.Java Hibernate @OneToMany Criteria Прогнозы, возвращаемые NULL

Я должен запросить собаку по ID, а также привести владельца в EAGER. Я установил этот код с помощью Hibernate 4.1.6, но не используется сопоставление XML. Мне нужны только некоторые поля из DOG и OWNER, используя Projections SQL, сгенерированный Hibernate, но мои объекты не заполняются, потому что DOG возвращает заполненные поля, но возвращает владельца. DOG.OWNER==NULL вот код, который я использую до сих пор .. . моего entities.other кода опускает краткость

@Entity 
public class Owner implements Serializable 
{ 
    Set<Dog>dogs=new HashSet<Dogs>(0); 
    @OneToMany(fetch=FetchType.LAZY, mappedBy="owner") 
    public Set<Dogs> getDogs(){return this.dogs}  
} 

@Entity 
public class Dog implements Serializable 
{ 
    private Owner owner;  
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="ownerid") 
    public Owner getOwner(){return this.owner;} 
} 

вот мой метод.

public Dog getDogAndOwnerById(Integer dogId) 
{ 
    Projection p=Projections.projectionList() 
    .add(Projections.property("d.id"),"id") 
     .add(Projections.property("o.id"),"id");//and others fields 
    Session session = getHibernateTemplate().getSessionFactory().openSession();   
    Criteria like = session.createCriteria(Dog.class,"d") 
    .add(Restrictions.idEq(dogId)).setProjection(p) 
    .setResultTransformer(Transformers.aliasToBean(Dog.class)) 
    .setFetchMode("owner",FetchMode.JOIN).createAlias("owner","o");   
    Dog dog = (Dog)like.uniqueResult();   
    //Object[]obj=(Object[])like.uniqueResult(); for(Object id:obj)System.out.println(id); 
    //System.out.println(obj.length); 
    session.close(); 
    return dog; 
    //dog is OK BUT dog.OWNER is null. 
}  

запрос совершен здесь является SQL

select 
    this_.ID as y0_, 
    owner_.ID as y1_ 
from 
    dog this_ 
inner join 
    owner owner_ 
     on this_.ownerid=owner_.ID 
where 
    and this_.ID = ?  

моей проблема ... случай собака не утративший все поля OK тем Dog.Owner является returnig нуля меня попробовать это не используется любые трансформаторы.

Object[]obj=(Object[])like.uniqueResult(); for(Object id:obj)System.out.println(id); 
System.out.println(obj.length); 

И я вижу, что данные верны, что Hibernate не возвращает мои объекты? Что я делаю неправильно.

любая помощь очень ценится.

[обновление] , если я использую этот

Projection p=Projections.projectionList() 
.add(Projections.property("d.id"),"id") 
.add(Projections.property("o.status"),"status"); 

и статус принадлежит к обеим таблицам Собачьей объект является заселить другой нет.

, если я использую

Projection p=Projections.projectionList() 
.add(Projections.property("d.id"),"id") 
.add(Projections.property("o.address"),"address"); 

и адрес принадлежат только владельцу исключение.

Exception in thread "main" org.hibernate.PropertyNotFoundException: 
Could not find setter for address on class com.generic.model.Dog 

Кажется, что Hibernate ВСЕГДА возвращает в Maximun 1 объект заселить они не могут заполнить обе таблицы [выбранные столбцы] в объекты [выбранные объекты]?

+0

Никто не может мне помочь? – chiperortiz

ответ

3

Я следую за этим сообщением Complex Hibernate Projections, и в результате я пишу собственный трансформатор, потому что resultTransformer alias для bean-компонента в спящем режиме на одном уровне.

вот мой простой resultTransformer

public class MyOwnTransformer implements ResultTransformer 
{ 
@Override//the same order in projection list properties is the same returned by data array... 
public Dog transformTuple(Object[]data,String[]alias) 
{return new Dog((Integer)data[0],new Owner((Integer)data[1]));} 
@Override 
public List transformList(List dogs){return dogs;}//nothing to do here.... 
} 

и в моих критериях я исправить код, как это.

public Dog getDogAndOwnerById(Integer dogId) 
{ 
    Projection p=Projections.projectionList() 
    .add(Projections.property("d.id"))//i dont need the alias anymore.. 
    .add(Projections.property("o.id")); 
    Session session = getHibernateTemplate().getSessionFactory().openSession();   
    Criteria like = session.createCriteria(Dog.class,"d") 
    .add(Restrictions.idEq(dogId)).setProjection(p) 

    .setResultTransformer(new MyOwnTransformer()) 

    .setFetchMode("owner",FetchMode.JOIN).createAlias("owner","o");   
    Dog dog = (Dog)like.uniqueResult();   
    session.close(); 
    return dog; 
}  

Я надеюсь, что это поможет кому-то.

+1

Будет ли он поддерживать, если вложенный объект является 'OneToMany (Collections)'? –

5

Я написал ResultTransformer, который может решить вашу проблему. Это имя AliasToBeanNestedResultTransformer, проверьте его на github.

+0

Я попробую попробовать. – chiperortiz

+1

это работает как шарм. этот трансформатор очень рекомендуется .. – chiperortiz

+1

Привет. Я долгое время использовал ваш трансформатор. Но в нем отсутствует «OneToMany» Вложенная выборка (которую вы также указали в своем Github). Вы написали NestedTransformer для OneToMany? Спасибо .. –

Смежные вопросы