Hibernate criteria Query to get specific columns

Używam criteria Query w moim kodzie. Zawsze odpala select * from ...

Zamiast tego chcę zaniedbać jedną kolumnę (pole) z mojego zapytania, ponieważ pole to ma dużą liczbę danych przechowywanych w bajtach. I to powoduje problemy z wydajnością.

Czy ktoś może dać na to jakiś pomysł?

Niektóre Aktualizacje

Dodałem projekcję w moim zapytaniu i stworzyło zapytanie typu...

select
    this_.TEMPLATE_ID as y0_,
    this_.TEMPLATE_NAME as y1_,
    this_.CREATE_DATE as y2_,
    this_.UPDATE_DATE as y3_,
    this_.STATUS_CODE as y4_,
    this_.USER_ID as y5_,
    this_.UPDATED_BY as y6_,
    this_.CATEGORY_ID as y7_,
    this_.PRACTICE_ID as y8_ 
from
    templates this_ 
inner join
    user user1_ 
        on this_.USER_ID=user1_.USER_ID 
inner join
    template_categories category2_ 
        on this_.CATEGORY_ID=category2_.CATEGORY_ID 
where
    y4_=? 
    and y8_=? 
    and y5_ in (
        ?, ?
    ) 
order by
    y1_ asc limit ?

A teraz problem jest jak.. Unknown column 'y4_' in 'where clause' i ten sam błąd dla y8_, y5_ oznacza dla wszystkich, gdzie blisko to dało błąd.

Zmodyfikowałem go na query like ...

select
    this_.TEMPLATE_ID as y0_,
    this_.TEMPLATE_NAME as y1_,
    this_.CREATE_DATE as y2_,
    this_.UPDATE_DATE as y3_,
    this_.STATUS_CODE as y4_,
    this_.USER_ID as y5_,
    this_.UPDATED_BY as y6_,
    this_.CATEGORY_ID as y7_,
    this_.PRACTICE_ID as y8_ 
from
    templates this_ 
inner join
    user user1_ 
        on this_.USER_ID=user1_.USER_ID 
inner join
    template_categories category2_ 
        on this_.CATEGORY_ID=category2_.CATEGORY_ID 
where
    this_.STATUS_CODE=1
    and this_.PRACTICE_ID=1 
    and this_.USER_ID in (
        1, 2
    ) 
order by
    y1_ asc limit ?
I zadziałało. Ale nie wiem jak to zmodyfikować w HQL?
Author: Ketan, 2012-07-24

2 answers

Użyj rzuty , Aby określić, które kolumny mają zostać zwrócone.

Przykład

zapytanie SQL

SELECT user.id, user.name FROM user;

Alternatywa Hibernate

Criteria cr = session.createCriteria(User.class)
    .setProjection(Projections.projectionList()
      .add(Projections.property("id"), "id")
      .add(Projections.property("Name"), "Name"))
    .setResultTransformer(Transformers.aliasToBean(User.class));

  List<User> list = cr.list();
 87
Author: Hemant Metalia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-26 09:23:46

Możesz odwzorować inny encja na podstawie tej klasy (powinieneś użyć encji-name, aby odróżnić te dwie), a drugi będzie rodzajem dto (nie zapomnij, że dto ma problemy z projektowaniem ). powinieneś zdefiniować drugi jako readonly i nadać mu dobrą nazwę, aby było jasne, że nie jest to zwykły byt. przy okazji wybierz tylko kilka kolumn nazywa projekcji, więc google z nim będzie łatwiejsze.

Alternatywa - możesz utworzyć nazwane zapytanie z listą pól które potrzebujesz (umieszczasz je w select ) lub użyj kryteriów z projekcją

 0
Author: Avihai Marchiano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-24 08:20:02