it-swarm-eu.dev

Dotaz podle režimu spánku a příkladů

Chcete-li to zkrátit: režim spánku nepodporuje projekce a dotaz podle příkladu? Našel jsem tento příspěvek:

Kód je následující:

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr))

Stejně jako druhý plakát řekl: Generovaný sql má stále místo, kde se odkazuje na just y0_ =? místo this_.city

Už jsem vyzkoušela několik přístupů a prohledala problémovou stopu, ale o tom nic nenašla.

Dokonce jsem se snažil použít Projection alias a Transformers, ale nefunguje to:

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr)).setResultTransformer(Transformers.aliasToBean(User.class));

Použil někdo projekce a dotaz podle příkladu?

21
Miguel Ping

Můžu vidět vaši třídu uživatelů? Toto je jen použití omezení dole. Nevidím, proč by omezení byla opravdu jiná než příklady (myslím, že pole null jsou v příkladech ignorována).

getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Restrictions.eq("city", "TEST")))
.setResultTransformer(Transformers.aliasToBean(User.class))
.list();

Nikdy jsem nepoužil alaistToBean, ale o tom jsem četl. Mohli byste také přehrát výsledky.

List<Object> rows = criteria.list();
for(Object r: rows){
  Object[] row = (Object[]) r;
  Type t = ((<Type>) row[0]);
}

Pokud musíte, můžete ručně obsadit uživatele tímto způsobem.

Je to trochu těžké podívat se do problému, aniž by nějaké další informace k diagnostice problému.

16
Arthur Thomas

Zdá se, že k problému dochází, pokud máte alias stejný název jako vlastnost objektů. Zdá se, že Hibernate vyzvedne alias a použije ho v sql. Našel jsem to zdokumentované zde a zde , a věřím, že je to chyba v režimu spánku, i když si nejsem jistý, že tým Hibernate souhlasí.

Ať tak či onak, našel jsem jednoduchou práci, která funguje v mém případě. Počet najetých kilometrů se může lišit. Podrobnosti jsou uvedeny níže, snažil jsem se zjednodušit kód tohoto vzorku, takže se omlouvám za chyby nebo překlepy:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("sectionHeader", sectionHeaderVar)) // <- Problem!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Vyrobí tento sql:

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(y1_) like ? ) 

Která způsobila chybu: Java.sql.SQLException: ORA-00904: "Y1_": neplatný identifikátor

Ale když jsem změnil své omezení, abych použil "toto", tak:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Vyrobil následující sql a můj problém byl vyřešen.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(this_.SECTION_HEADER) like ? ) 

A je to! Velmi jednoduchá oprava k bolestivému problému. Nevím, jak by se tato oprava překládala na dotaz příkladným problémem, ale může vás přiblížit.

44
Ryan Cook

Skutečným problémem je, že v režimu spánku existuje chyba, kde v klauzuli kde používá aliasy se seznamem:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-817

Pro případ, že by tu někdo hledal odpovědi, podívejte se na lístek. Trvalo 5 let, než se to vyřešilo, ale teoreticky to bude v jedné z příštích verzí a pak se domnívám, že váš problém zmizí.

6
Dobes Vandermeer

Mám podobný problém. Používám dotaz podle příkladu a chci výsledky třídit podle vlastního pole. V SQL bych udělal něco jako:

select pageNo, abs(pageNo - 434) as diff
from relA
where year = 2009
order by diff

Funguje to dobře bez doložky o objednávce. Co mám, je

Criteria crit = getSession().createCriteria(Entity.class);
crit.add(exampleObject);
ProjectionList pl = Projections.projectionList();
pl.add( Projections.property("id") );
pl.add(Projections.sqlProjection("abs(`pageNo`-"+pageNo+") as diff", new String[] {"diff"}, types ));
crit.setProjection(pl);

Ale když přidám 

crit.addOrder(Order.asc("diff"));

Mám org.hibernate.QueryException: nemohl vyřešit vlastnost: diff exception. Řešení s to nefunguje. 

PS: Jelikož jsem nemohl najít žádnou podrobnou dokumentaci o používání QBE pro Hibernate, všechny výše uvedené věci jsou hlavně přístupy pokusů a omylů

0
VHristov
ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("id"));
pl.add(Projections.sqlProjection("abs(`pageNo`-" + pageNo + ") as diff", new String[] {"diff"}, types ), diff); ---- solution
crit.addOrder(Order.asc("diff"));
crit.setProjection(pl);
0
singh