свойство проекции в подзапросе критерии гибернации

Дело вот в чем, у меня 2 стола:

table (A) with columns ( colA_1  | colA_2 | colA_ID ) <br>
table (B) with columns ( colB )

и я использую DetachedCriteria.For<AnyEntity>() для запроса SQL.

Цель состоит в том, чтобы создать sql, подобный этому:

Select A.colA_ID from A 
where (CAST(colA_1 AS VARCHAR(10)) + CAST(colA_2 AS VARCHAR(10))) 
in (select colB from B)

Заранее благодарю за любую помощь


person Pedro Tainha    schedule 16.11.2015    source источник


Ответы (1)


Я настоятельно рекомендую создать специальное свойство для вашей сущности A:

public class EntityA
{
    ...
    public virtual string ProjectedKey { get; set; } 
}

И сопоставьте его как только чтение с помощью формулы

<property name="ProjectedKey" 
          formula="(CAST(colA_1 AS VARCHAR(10)) + CAST(colA_2 AS VARCHAR(10)))" 
          insert="false" update="false" />

А теперь простой в использовании подзапрос

// subquery to get colB (its id?) from table B
var detachedQuery = DetachedCriteria.For<EntityB>()    
     .SetProjection(Projections.Id()) // or property representing col B

// use subquery with property represented by formula
var rootQuery = session.CreateCriteria<EntityA>()
     .Add(Subqueries.PropertyIn("ProjectedKey", detachedQuery));
person Radim Köhler    schedule 17.11.2015
comment
Спасибо Radim, решение работает для простой проблемы, которую я опубликовал, но настоящая проблема сложнее, чем я написал. Я пытался приспособить это к моей ситуации, но у меня ничего не получалось. представьте, что в (CAST (colA_1 AS VARCHAR (10)) + CAST (colA_2 AS VARCHAR (10))) мне не нужен colA_2, но я хочу colC_2 из таблицы C. Это потому, что у меня есть составной ключ в EntityA, как и у вас определено в вашем решении - person Pedro Tainha; 17.11.2015
comment
Это слишком сложно. Такие сценарии превышают возможности инструментов ORM. Он не предназначен для решения НЕ стандартных ключей. Даже с точки зрения БД такие запросы малоэффективны. Я хотел бы предоставить вам общее решение с NHibernate здесь ... но единственный способ - исправить дизайн БД. Шутки в сторону. Вы можете сделать это сейчас или позже, но мой опыт говорит: другого пути нет ... извините. В любом случае удачи с NHibernate;) - person Radim Köhler; 17.11.2015
comment
Еще раз спасибо, Радим, мне удалось использовать параметр формулы для достижения того, что я хочу, например здесь http://stackoverflow.com/questions/13114619/using-a-property-mapping-with-a-formula-in-nhibernate, но недостатком является смешивание чистого sql, которое нарушит преимущество целостности между моделью C # и БД. - person Pedro Tainha; 17.11.2015