简体   繁体   English

休眠标准在属性上相等

[英]Hibernate criteria equal on property

I have a Language: 我有一种Language:

class Language {
    private Site site;
    private Locale locale;
    //other usual stuff
}

I have a Site : 我有一个Site

class Site {
    private Long id;
    private Set<Language> languages;
    private Locale primeLocale;
    //usual stuff
}

And I've been struggling for days to get primary language by site's id, is it even possible to filter by properties in hibernate? 而且我一直在努力地通过站点的ID获取主要语言,甚至可以通过休眠中的属性进行过滤吗? What i want is equivalent to this sql: 我想要的等效于此sql:

select *
from languages as l
join sites as s on l.locale = s.primeLocale
where l.siteId = (some id)

I tried following: 我尝试了以下操作:

public Language getPrimeLanguageBySite(Long siteId) {
        Criteria criteria = session.createCriteria(Language.class).add(Restrictions.eq("site.id", siteId))
                .add(Restrictions.eq("site.primeLocale", Property.forName("locale")));
        return (Language)criteria.setMaxResults(1).uniqueResult();
    }

But it fails with unknown column 'site.primeLocale' in 'where clause' , and I can't even form my question without describing all this, so my attempts with google failed, could somebody please help? 但是它失败,并unknown column 'site.primeLocale' in 'where clause'带有unknown column 'site.primeLocale' in 'where clause' ,并且我什至无法描述所有问题而无法提出问题,因此我在google上的尝试失败了,有人可以帮忙吗? How can I get language by siteId and site's primeLocale? 如何通过siteId和网站的primeLocale获取语言?

You should use an alias and eqProperty. 您应该使用别名和eqProperty。

public Language getPrimeLanguageBySite(Long siteId) {    
  Criteria c = session.createCriteria(Language.class, "language");   
  c.createAlias("language.site", "site");
  c.add(Restrictions.eqProperty("site.primeLocale", "language.locale"));
  c.add(Restrictions.eq("site.id", siteId));
  return c.setMaxResults(1).uniqueResult();
}

You can use an alias . 您可以使用别名

public Language getPrimeLanguageBySite(Long siteId) {    
  Criteria c = session.createCriteria(Language.class, "language");   
  c.createAlias("language.site", "site");
  c.add(Restrictions.eq("site.primeLocale", "language.locale"));
  c.add(Restrictions.eq("site.id", siteId));
  return c.setMaxResults(1).uniqueResult();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM