Java hibernate如何将限制添加到条件对象?

在此示例中,您将学习如何向Criteria对象添加限制。使用限制,我们可以缩小查询的结果。在下面的代码中,我们添加了一些限制,如Restrictions.eq(),Restrictions.like()和Restrictions.isNotNull()。

在Hibernate框架中,您会发现很多使用方法链的类。在下面的示例中,您可以看到我们实际上可以通过调用add()方法来添加无尽的限制。

package org.nhooo.example.hibernate.criteria;

import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.HibernateException;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.cfg.Configuration;
import org.nhooo.example.hibernate.model.Track;

import java.util.List;

public class RestrictionsDemo {
    public static Session getSession() throws HibernateException {
        String cfg = "hibernate.cfg.xml";
        SessionFactory sessionFactory = new Configuration().configure(cfg)
            .buildSessionFactory();
        return sessionFactory.openSession();
    }

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        try (Session session = getSession()) {
            Criteria criteria = session.createCriteria(Track.class)
                .createAlias("artist", "artist")
                .createAlias("genre", "genre")
                .add(Restrictions.eq("title", "Ob-La-Di, Ob-La-Da"))
                .add(Restrictions.like("artist.name", "%beatles%"))
                .add(Restrictions.isNotNull("genre.name"));

            List<Track> tracks = criteria.list();
            for (Track track : tracks) {
                System.out.println("Track = " + track.getTitle() +
                    "; Artist = " + track.getArtist().getName() +
                    "; Genre = " + track.getGenre().getName());
            }
        }
    }
}

以下是一些其他限制,也可以用于缩小Criteria查询结果的范围,有关完整的限制,请参见Restrictions类文档。

  • Restrictions.ne("title", "Twist and Shout") –对命名属性应用“不相等”约束。

  • Restrictions.ilike("title", "Twist%") –不区分大小写的“喜欢”。

  • Restrictions.isNull("title") –将“ is null”约束应用于命名属性。

  • Restrictions.gt("duration", new Integer(200)) –将“大于”约束应用于命名属性。

  • Restrictions.between("duration", new Integer(100), new Integer(200)) –将“介于”约束应用于命名属性

  • Restrictions.or(criterionA, criterionB) –返回两个表达式的析取。

  • Restrictions.disjuction() –将表达式分组在一起。