2008-11-25 10 views
3

J'utilise la base de données SQLite et ont la suivante classe persistante (simplifiée):Utilisation de dates dans le « où » clause de HQL requête

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

qui est mis en correspondance avec cette table dans la base de données:

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

Maintenant, j'ai besoin d'écrire une requête qui va sélectionner tous les projets qui ont commencé dans un mois donné.

Dans SQL je pourrais utiliser:

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

Ce que je n'aime pas au sujet de cette requête est qu'il utilise la base de données fonction spécifique « strftime ».

Ainsi, la HQL suivante dépend de la base de données sous-jacente:

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

J'ai aussi essayé « du projet p où p.StartDate.Month = 12 », mais cela n'a pas fonctionné. Donc, en utilisant l'API HQL ou les critères, est-il possible d'écrire une telle requête dans une base agnostique de base de données?

Répondre

4

Si vous interrogez régulièrement des mois, des jours et des années, vous ne devriez pas vraiment stocker votre date dans une colonne DateTime - cela rend les requêtes incroyablement inefficaces. Vous pouvez facilement créer une colonne "Month" et lancer une requête contre celle-ci (et votre DBA vous aimerait à nouveau)

-1

de Project p où p.StartDate.ToString ("M");

+0

David, j'ai essayé ce que vous suggérez mais je m'y suis la même exception que si je p.StartDate.Month = 12. NHibernate.QueryException: déréférencé: StartDate –

Questions connexes