1

NHibernate の SQL クエリを作成しようとしています:

SQL は次のようになります。

Select p.*
From PPoint p
Inner join PPFile f on p.ImportID = f.ImportID
where p.Name like '%a%'
Or p.Code like '%a%'
Or f.FileName like '%a%'

まともな例が見つからないのは、簡単に聞こえるかもしれません。

現在、私は持っています:

        var pointList = session
            .CreateCriteria(typeof(PPoint))
           .Add(Restrictions.Or(Restrictions.Or(Restrictions.Or(Restrictions.Or
                Restrictions.Like("Name", "%" + search + "%"),
                Restrictions.Like("Code", "%" + search + "%")),
                Restrictions.Like("Test", "%" + search + "%")),
                Restrictions.Like("Test2", "%" + search + "%")),
                Restrictions.Like("FileName", "%" + search + "%")))
            .List<PPoint>();

NHibernate バージョン 2.2

4

2 に答える 2

1

Found solution:

var pointList = session
                .CreateCriteria(typeof(PPoint), "p")
                .CreateAlias("ImportFile", "f", NHibernate.SqlCommand.JoinType.InnerJoin)
                .Add(Restrictions.Disjunction()
                    .Add(Restrictions.Like("p.Name", search, MatchMode.Anywhere))
                    .Add(Restrictions.Like("p.Code", search, MatchMode.Anywhere))
                    .Add(Restrictions.Like("p.Test1", search, MatchMode.Anywhere))
                    .Add(Restrictions.Like("p.Test2", search, MatchMode.Anywhere))
                    .Add(Restrictions.Like("f.FileName", search, MatchMode.Anywhere)))
                .List<PPoint>();

Major thing is to describe relationship in mapping file:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="AAA.Data"
                   namespace="AAA.Data.Domain">

  <class name="PPoint" lazy="true">
    <id name="PPointID" />
    <!--<property name="ImportID" />-->
    <many-to-one name="ImportFile" column="ImportID" not-null="true" cascade="all-delete-orphan" />

    <property name="Code" />
    <property name="Test1" />

    ...
  </class>

于 2013-02-04T22:26:27.477 に答える
0

nHibernate 3.0 以降を使用していますか? この種のクエリは、QueryOver APIに非常によく適合します。

string searchString = string.Format("%{0}%", search);
PPoint ppointAlias = null;
PPFile ppFileAlias = null;
var pointList = session.QueryOver<PPoint>(() => ppointAlias)
                       .JoinQueryOver<PPFile>(ppPoint => ppPoint.ImportFile, () => ppFileAlias)
                       .Where(
                                 Restrictions.On(() => ppointAlias.Name).IsLike(searchString))
                                              ||
                                 Restrictions.On(() => ppointAlias.Code).IsLike(searchString))
                                              ||
                                 Restrictions.On(() => ppFileAlias.FileName).IsLike(searchString))
                              )
                        .List();
于 2013-02-04T22:26:45.280 に答える