Моя компания дает разработчикам дни, когда мы можем экспериментировать и работать над любимыми проектами (например, в Google), и я потратил некоторое время на работу над платформой для использования примеров запросов, обходя ограничения, описанные выше.Я придумал что-то, что могло бы быть полезным для других людей, интересующихся также примерами запросов.Вот пример структуры с использованием примера Product.
Criteria criteriaQuery = session.createCriteria(Product.class);
Restrictions<Product> restrictions = Restrictions.create(Product.class);
Product example = restrictions.getQueryObject();
example.setName(restrictions.like("N%"));
example.setPromo("Discounts up to 10%");
restrictions.addRestrictions(criteriaQuery);
Вот попытка исправить проблемы в примере кода из вопроса - проблема значения по умолчанию для поля "price" больше не существуетсуществует, потому что эта структура требует, чтобы критерии были установлены явно.Вторая проблема, связанная с включением функции enableLike () для всего запроса, устранена - средство сопоставления находится только в поле «имя».
Другие проблемы, упомянутые в вопросе, также исчезли в этой структуре.Вот примеры реализаций.
product.setPrice(restrictions.gt(10)); // price > 10
product.setPromo(restrictions.order(false)); // order by promo desc
Restrictions<Manufacturer> manufacturerRestrictions
= Restrictions.create(Manufacturer.class);
//configure manuf restrictions in the same manner...
product.setManufacturer(restrictions.join(manufacturerRestrictions));
/* there are also joinSet() and joinList() methods
for one-to-many relationships as well */
Доступны даже более сложные ограничения.
product.setPrice(restrictions.between(45,55));
product.setManufacturer(restrictions.fetch(FetchMode.JOIN));
product.setName(restrictions.or("Foo", "Bar"));
После показа структуры коллеге он упомянул, что многие объекты, сопоставленные с данными, имеют частные установщики, что делаетэтот тип критериев также сложен (другая проблема с примером API!).Итак, я тоже это учел.Вместо использования сеттеров, геттеры также могут запрашиваться.
restrictions.is(product.getName()).eq("Foo");
restrictions.is(product.getPrice()).gt(10);
restrictions.is(product.getPromo()).order(false);
Я также добавил некоторые дополнительные проверки объектов для обеспечения лучшей безопасности типов - например, относительные критерии (gt, ge, le, lt).) все требуют значения?расширяет Comparable для параметра.Кроме того, если вы используете метод получения в указанном выше стиле, и на получателе присутствует аннотация @Transient, он выдаст ошибку времени выполнения.
Но подождите, есть еще!
Есливам нравится, что встроенная в Hibernate утилита Restrictions может быть статически импортирована, так что вы можете делать такие вещи, как attribute.addRestriction (eq ("name", "foo")), не делая ваш код действительно подробным, для этого тоже есть вариант.
Restrictions<Product> restrictions = new Restrictions<Product>(){
public void query(Product queryObject){
queryObject.setPrice(gt(10));
queryObject.setPromo(order(false));
//gt() and order() inherited from Restrictions
}
}
Вот и все - заранее большое спасибо за любые отзывы!Мы разместили код на Sourceforge для тех, кто заинтересован.http://sourceforge.net/projects/hqbe2/