Нет - ни то, ни другое. Согласно Go для программистов на C ++ документы,
Go не поддерживает перегрузку функций и не поддерживает определяемые пользователем операторы.
Я не могу найти столь же ясное утверждение, что необязательные параметры не поддерживаются, но они также не поддерживаются.
Я делаю некоторые предположения о том, на что смотрит пользователь, но похоже, что вы хотите получить дочерние элементы только в том случае, если пользователь уже просмотрел родительский элемент и действительно хочет их видеть. .
Почему бы не попробовать открыть новый сеанс и получить детей от их родителей? Что-то вроде ...
criteria = session.createCriteria(Child.class);
criteria.add(Restrictions.eq("parent", parent));
List<Child> children = criteria.list();
Ленивая коллекция может быть загружена с помощью Hibernate.initialize (parent.getCollection ()), за исключением того, что родительский объект должен быть присоединен к активному сеансу.
Это решение берет родительский объект Entity и имя поля с отложенной загрузкой и возвращает Entity с полностью загруженной коллекцией.
К сожалению, поскольку родительский элемент необходимо повторно подключить к вновь открытому сеансу, я не могу использовать ссылку на отложенную коллекцию как это будет ссылаться на отдельную версию Entity; отсюда fieldName и отражение. По той же причине он должен возвращать присоединенный родительский объект.
Таким образом, в сценарии OP этот вызов может быть сделан, когда пользователь выбирает просмотр ленивой коллекции:
Parent parentWithChildren = dao.initialize(parent,"lazyCollectionName");
Метод:
public Entity initialize(Entity detachedParent,String fieldName) {
// ...open a hibernate session...
// reattaches parent to session
Entity reattachedParent = (Entity) session.merge(detachedParent);
// get the field from the entity and initialize it
Field fieldToInitialize = detachedParent.getClass().getDeclaredField(fieldName);
fieldToInitialize.setAccessible(true);
Object objectToInitialize = fieldToInitialize.get(reattachedParent);
Hibernate.initialize(objectToInitialize);
return reattachedParent;
}
Hibernate обрабатывает коллекции иначе, чем обычные поля.
В моей работе мы обходим это, просто инициализируя поля в начальной загрузке, которые нам нужны в каждом конкретном случае. Например, в методе загрузки фасада, окруженном транзакцией, у вас может быть:
public Parent loadParentWithIntent1(Long parentId)
{
Parent parent = loadParentFromDAO();
for (Child c : parent.getChildren())
{
c.getField1();
}
}
и у нас есть разные вызовы фасада для каждого намерения. По сути, это обеспечивает то, что вам нужно, потому что вы будете загружать эти конкретные поля, когда они вам понадобятся, и это просто помещает их в сеанс во время загрузки.