NHibernate - проблема AddEntity и AddJoin - PullRequest
6 голосов
/ 15 июля 2009

Я использую NHibernate с запросом SQL для заполнения некоторых объектов сущности.

У меня есть объект Item, который ссылается на объект User (чтобы указать владельца Item)

class Item
{
public User User;
}

Мой SQL-запрос (на самом деле он более сложный, поэтому я не могу использовать HQL, но я начал с этого, чтобы убедиться, что AddJoin / AddEntity работал):

SELECT {i.*}, {u.*}
FROM Item i INNER JOIN User u ON (i.UserId = u.Id)
WHere i.Id = 5

Вот мой код:

var x = session.CreateSQLQuery(sql)
    .AddEntity("i", typeof(Item))
    .AddJoin("u", "i.User")
    .List();

Когда я запускаю это, я получаю двумерный массив. Каждый элемент в массиве содержит объект Item (с инициализированным свойством User) и сам объект User.

Чего мне не хватает? Я надеялся получить список объектов Item с инициализированным свойством User (именно так я интерпретировал документацию).

Ответы [ 6 ]

5 голосов
/ 07 октября 2009

Я просто потратил впустую день, чтобы понять это. SetResultTransformer (CriteriaUtil.DistinctRootEntity) работает с последним добавленным элементом.

Вот что я сделал, чтобы получить первую сущность из запроса. Одна ловушка, однако, мне пришлось изменить NHibernate.DistinctRootEntityResultTransformer.TransformTuple (), чтобы быть виртуальным. Ничего страшного для нас, потому что мы уже разветвили NHibernate для некоторых тривиальных дополнений, подобных этому. Если вы не хотите разветвлять NH, было бы легко свернуть ваш собственный IResultTransformer, убедившись, что элементы уникальны.

добавить это к вашему запросу:

query.SetResultTransformer(new FirstTupleDistinctResultTransformer());

и это новый класс:

public class FirstTupleDistinctResultTransformer : DistinctRootEntityResultTransformer
{
    public override object TransformTuple(object[] tuple, string[] aliases)
    {
        return tuple[0];
    }
} 
3 голосов
/ 12 июня 2013
var x = session.CreateSQLQuery(sql)     
    .AddEntity("i", typeof(Item))     
    .AddJoin("u", "i.User") 
    .AddEntity("i", typeof(Item)).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

он вернет только элемент

1 голос
/ 05 января 2011

попробуйте

    using NHibernate.Transform;
    //..

    var x = session.CreateSQLQuery(sql)     
    .AddEntity("i", typeof(Item))     
    .AddJoin("u", "i.User") 
    .AddEntity("i", typeof(Item))
    .SetResultTransformer(new DistinctRootEntityResultTransformer())

    .List(); 
1 голос
/ 15 июля 2009

Это было давно, но я думаю, что вы упускаете это:

.SetResultTransformer(new DistinctEntityRootTransformer())
0 голосов
/ 15 июля 2009

Если ваше отображение верно, вы можете просто использовать выборку соединения, чтобы получить все это одним ударом, например:

var x = session.CreateQuery("from Item i join fetch i.User").List<Item>();
0 голосов
/ 15 июля 2009

Что произойдет, если вы опустите метод AddJoin? Разве не достаточно просто указать AddEntity?

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