Vra

Maak dit kort: hiberneer nie vooruitskattings en navraag deur voorbeeld te ondersteun? Ek het gevind dat hierdie post:

Die kode is:

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))

Soos die ander plakkaat gesê: Die gegenereerde sql hou met 'n waar klas verwys na net y0_ =? in plaas van this_.city .

Ek probeer al verskeie benaderings, en deursoek die issue tracker maar niks gekry nie hieroor.

Ek het selfs probeer om Projeksie alias en transformators gebruik, maar dit werk nie:

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));

Het iemand gebruik projeksies en navraag deur voorbeeld?

Was dit nuttig?

Oplossing

Kan ek sien jou User klas? Dit is net die gebruik van onder beperkings. Ek kan nie sien waarom Beperkings regtig enigsins anders as Voorbeelde sou wees (ek dink nul velde ontslae geïgnoreer by verstek in voorbeelde al).

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();

Ek het nog nooit gebruik die alaistToBean, maar ek het net lees daaroor. Jy kan ook net lus oor die resultate ..

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

As jy jou kan met die hand User vul jouself op die manier.

Die soort van moeilik om te kyk na die kwessie sonder 'n paar meer inligting om die probleem te diagnoseer.

Ander wenke

Die probleem blyk te gebeur wanneer jy 'n alias dieselfde naam as die eiendom voorwerpe. Hibernate blyk te haal die alias en gebruik dit in die sql. Ek het gevind dat hierdie gedokumenteer hier en hier , en ek glo dat dit 'n fout in Hibernate wees, hoewel ek nie seker dat die Hibernate span is dit eens.

In ieder geval, ek het 'n eenvoudige werk rondom wat werk in my geval gevind. Jou kilometers kan wissel. Die besonderhede is onder, het ek probeer om die kode te vereenvoudig vir hierdie monster so ek vra om verskoning vir enige foute of typo's:

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));

Sou hierdie sql produseer:

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 ? ) 

Watter veroorsaak 'n fout: java.sql.SQLException: ORA-00904: "Y1_": ongeldig identifiseerder

Maar, toe ek my beperking te gebruik verander "hierdie", soos so:

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));

Dit vervaardig die volgende SQL en my probleem is opgelos.

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 ? ) 

Dis, dit! 'N redelik eenvoudige oplossing om 'n pynlike probleem. Ek weet nie hoe dit fix sou vertaal na die navraag deur voorbeeld probleem, maar dit kan jy nader kom.

Die werklike probleem hier is dat daar 'n fout in hiberneer waar dit gebruik kies-lys aliasse in die waar-klousule:

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

Net in geval iemand lande hier op soek na antwoorde, gaan kyk na die kaartjie. Dit het 5 jaar op te los, maar in teorie dit sal wees in een van die volgende vrystellings en dan vermoed ek jou probleem sal weggaan.

Ek is die gesig staar 'n soortgelyke probleem. Ek gebruik Query deur voorbeeld en ek wil die resultate deur 'n pasgemaakte veld sorteer. In SQL sou ek so iets te doen:

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

Dit werk goed sonder die orde-vir-klousule. Wat ek is

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);

Maar toe ek by

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

Ek kry 'n org.hibernate.QueryException: kon nie los eiendom: diff uitsondering nie. Tydelike oplossing met hierdie nie gewerk nie.

PS: as ek 'n uitgebreide dokumentasie oor die gebruik van QBE vir Hibernate nie kon vind, al die dinge wat daarbo is hoofsaaklik probeer-en-tref benadering

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);

Ek dink nie regtig so, wat ek kan vind is die woord "hierdie." veroorsaak dat die hiberneer nie aan enige beperkings in sy soektog, wat beteken dat dit het al die rekords lyste in te sluit. Oor die hiberneer fout wat aangemeld is, kan ek sien dit gerapporteer as vaste, maar ek is dit heeltemal versuim het om die pleister af te laai.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top