Использование дат в предложении «где» HQL-запроса - PullRequest
3 голосов
/ 25 ноября 2008

Я использую базу данных SQLite и имею следующий постоянный класс (упрощенный):

public class Project
{
    public virtual int Id { get; set; }
    public virtual DateTime StartDate { get; set; }
}

, который отображается на эту таблицу в базе данных:

CREATE TABLE projects (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    start_date DATETIME
)

Теперь мне нужно написать запрос, который выберет все проекты, начатые в данном месяце.

В SQL я мог бы использовать:

SELECT id FROM projects WHERE strftime('%m', start_date) = '12'

Что мне не нравится в этом запросе, так это то, что он использует функцию базы данных " strftime ".

Таким образом, следующий HQL зависит от базовой базы данных:

// Get all projects that started in December (no matter which year)
var projects = session
    .CreateQuery(
        "from Project p " +
        "where strftime('%m', p.StartDate) = :month")
    .SetParameter("month", "12")
    .List<Project>();

Я также пытался "из проекта p, где p.StartDate.Month = 12", но это не сработало.

Таким образом, используя HQL или API критериев, можно ли написать такой запрос независимым от базы данных способом?

Ответы [ 3 ]

4 голосов
/ 25 ноября 2008

Если вы регулярно запрашиваете месяцы, дни, годы, вам не следует хранить дату в столбце DateTime - это делает запросы невероятно неэффективными. Вы можете легко создать столбец «Месяц» и запросить его (и ваш администратор базы данных снова полюбит вас)

1 голос
/ 17 декабря 2008

Я настоятельно рекомендую вам написать пользовательскую функцию.

http://ayende.com/Blog/archive/2006/10/01/UsingSQLFunctionsInNHibernate.aspx

Я не имею в виду функцию sql, я имею в виду функцию NHibernate, которая зарегистрирована в RegisterFunction для улучшения диалекта NHibernate.

Другой, вероятно, лучший пример: http://ayende.com/Blog/archive/2007/04/27/Paged-data--Count-with-NHibernate-The-really-easy-way.aspx

0 голосов
/ 25 ноября 2008

из проекта p, где p.StartDate.ToString ("M");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...