Hibernate объединяет несколько запросов - PullRequest
0 голосов
/ 21 ноября 2018

Допустим, у меня есть следующая структура базы данных:

enter image description here

В красном вы видите ТАБЛИЦЫ, а в черном ПОЛЯ

Структура (s) связаны с LocationType с использованием StructureLocationType

Теперь мне нужно получить список структур, которые принадлежат LocationType:

    // get LocationType
    LocationTypeEntity locationTypeEntity = databaseManager.selectLocationType(session, locationTypeID);

    // get list of StructureLocationType(s)
    List<StructureLocationTypeEntity> structureLocationTypeEntities = databaseManager.selectStructureLocationTypes(session, locationTypeID);

    // get list of Structures(s)
    List<StructureEntity> structures = new ArrayList<>();
    for (StructureLocationTypeEntity structure: structureLocationTypeEntities)
    {
        structures.add(databaseManager.selectStructure(session, structure.getStructureId()));
    }
    return structures;

Мои вспомогательные методы для извлечения данных с использованием hibernate:

public LocationTypeEntity selectLocationType(Session session, int id)
{
    session.beginTransaction();
    LocationTypeEntity locationTypeEntity = session.get(LocationTypeEntity.class, id);
    session.getTransaction().commit();
    return locationTypeEntity;
}

public List<StructureLocationTypeEntity> selectStructureLocationTypes(Session session, int locationTypeId)
{
    session.beginTransaction();
    CriteriaBuilder builder = session.getCriteriaBuilder();
    CriteriaQuery<StructureLocationTypeEntity> query = builder.createQuery(StructureLocationTypeEntity.class);
    Root<StructureLocationTypeEntity> root = query.from(StructureLocationTypeEntity.class);
    query.select(root).where(builder.equal(root.get("locationTypeId"), locationTypeId));
    Query<StructureLocationTypeEntity> q = session.createQuery(query);
    List<StructureLocationTypeEntity> locationTypeEntities = q.getResultList();
    session.getTransaction().commit();
    return locationTypeEntities;
}

public StructureEntity selectStructure(Session session, int structureID)
{
    session.beginTransaction();
    StructureEntity structure = session.get(StructureEntity.class, structureID);
    session.getTransaction().commit();
    return structure;
}

Так что это уже кажется неэффективным, но при условии, что было 3 Структуры , связанных с LocationType , для получения списка структур требуется ~ 1200 мс.Я использую его для тестирования автоматизации, поэтому теоретически это должна быть скорость света, но я считаю, что мне нужно улучшить ее, был бы признателен, если кто-то может помочь мне улучшить мой код, чтобы, возможно, выполнить его с помощью одного запроса?(теперь очевидно, что он отправляет несколько запросов к базе данных)

Спасибо.

1 Ответ

0 голосов
/ 22 ноября 2018

Нашел решение, довольно простое на самом деле (не знал об этом)

, используя ключевое слово JOIN и выполнив один собственный запрос:

Query q = session.createNativeQuery("Select *, StatusId \n" +
        "FROM dbo.Structure AS S\n" +
        "JOIN dbo.StructureLocationType AS SLT ON SLT.StructureId = S.Id\n" +
        "WHERE SLT.LocationTypeId = 1080").addEntity(StructureEntity.class);

List<StructureEntity> zones2 = q.list();

Где в этом случае было 1080мой идентификатор LocationType.

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