2015-04-13 2 views
2

У меня есть Bill и Bill_Details с onetomany и manytoone Relationship. Мне нужна помощь в получении Билла Списка.как вернуть критерии Отличный результат

Pojo

Билл

@OneToMany(cascade={CascadeType.ALL},fetch = FetchType.EAGER) 
@JoinColumn(name = "bill_id") 
private Set<BillDetails> billDetails = new HashSet<BillDetails>(); 

BillDetails

@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER) 
@JoinColumn(name = "bill_id") 
private Bill billId; 

Я использую проекции принять значение Билла из списка.

DaoHibernate

@Transactional 
public List<Bill> getbillDetailsByBillId(String billId) { 
    Criteria cr = null; 
    try { 
     cr = getSession().createCriteria(Bill.class,"bill") 
       .createAlias("bill.billDetails","billDetails") 
       .setProjection(Projections.projectionList() 
    // I tried .setProjectionProjections.distinct(Projections.projectionList() 
         .add(Projections.property("billNo"),"billNo") 
         .add(Projections.property("billDetails.amount"),"billDetails.amount") 
         .add(Projections.property("billDetails.rate"),"billDetails.rate"))       
         .add(Restrictions.eq("id", billId)) 
         .setResultTransformer(new AliasToBeanNestedResultTransformer(Bill.class)); 

    } catch (Exception e) { 
     System.out.println("Get bill DetailsByBillId Error----------"+e); 
     e.printStackTrace(); 
    } 
    System.out.println(cr.list().size()); 
    return cr.list(); 
} 

Примечание:

-> Билл таблица содержит Однорядовый

-> таблица BillDetails содержит четыре строки для этого BillId

Мои критерии Query Возвращает четыре объекта вместо одного Объект. Я также пробовал с отличной функцией.

Ожидаемый выход:

Мне нужен один объект, который содержит BillDetails объекты (4 значения). ie.I объясняется образец формата Json ниже

{billNo:231, 
    billDetails[{amount:100,rate:1}{amount:200,rate:2} 
    {amount:300,rate:30}{amount:400,rate:4}] } 

Как получить это с помощью Hibernate критериев запроса? Пожалуйста, помогите

ответ

1

Прежде всего, неправильное отображение. У вас есть двунаправленная связь, и одна из сторон (одна стороны) должна быть обратными одной стороны:

@OneToMany(mappedBy = "billId", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
private Set<BillDetails> billDetails = new HashSet<BillDetails>(); 

Вы должны также переименовать поля billId к законопроекту, учитывая то, что он содержит, законопроект , а не идентификатор счета.

Теперь проблема с вашим запросом заключается в том, что вы используете прогнозы без причины. При использовании прогнозов вы намеренно выбираете строки, содержащие отдельные столбцы. И поскольку SQL-запрос возвращает 4 строки, вы возвращаете 4 счета: по одному для каждой строки.

Вы также делаете свою жизнь излишне сложной, используя запрос Criteria вместо HQL, который гораздо более подходит для таких простых статических запросов.

Но даже запрос HQL бесполезен здесь, поскольку вы просто хотите получить счет из своего идентификатора. Все, что вам нужно, это

Bill bill = (Bill) session.get(Bill.class, billId); 

Это позволит получить счет, и так как вы решили сделать OneToMany ассоциации, как EAGER, он также будет немедленно загрузить его детали счетов.

Если вы не сделали ассоциации EAGER (и вы должны действительно оставить его ленивым), вы можете использовать этот простой запрос HQL, чтобы загрузить счет с его детали:

select distinct b from Bill bill 
left join fetch bill.billDetails 
where bill.id = :billId 
+0

Большое спасибо: -) It Works Fine .. –

+0

Мне нужно достичь путем проецирования Поскольку у меня есть проблемы в JSON "на com.google.gson.Gson $ FutureTypeAdapter.write (Gson.java:899) \t на com.google.gson.internal .bind.TypeAdapterRuntimeTypeWrapper.write (TypeAdapterRuntimeTypeWrapper.java:68) ". с помощью прогнозов ошибка исчезла. Пожалуйста, помогите с этой ошибкой. –

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