Отображение Hibernate OGM @Embeddable объекты нативного запроса - PullRequest
0 голосов
/ 30 ноября 2018

Как я могу прочитать список объектов @Embeddable из MongoDB с Hibernate OGM после агрегирования.

У меня есть такая сущность

@javax.persistence.Entity
public class MySession implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Type(type = "objectid") 
    private String id;
    private Date start;
    private Date end;
    @ElementCollection
    private List<MySessionEvent> events;
}

и объект @Embeddable

@javax.persistence.Embeddable
public class MySessionEvent implements Serializable {
    private Long time;
    private String name;
}

Я застрял с отображением Встраиваемые объекты из собственного запроса

String queryString = "db.MySession.aggregate([" +
            "   { '$match': { 'events.name': { '$regex': 'Abrakadabra'} }}, " +
            "   { '$unwind': '$events' }, " +
            "   { '$replaceRoot': { 'newRoot': '$events'}} " +
            "])";

List<MySessionEvent> objects = em.createNativeQuery(queryString, MySessionEvent.class).getResultList();

Я получаю ошибку Caused by: org.hibernate.MappingException: Unknown entity

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Копируете ваш комментарий сюда, потому что он добавляет некоторые детали:

У меня есть такие данные [{id: 's1', события: [{name: 'one'}, {name: 'два '}]}, {id:' s2 ', события: [{name:' three '}, {name:' four '}]}], и я хочу получить такой результат [{name:' one '}, {name: 'two'}, {name: 'three'}, {name: 'four'}]

Запущенный вами запрос возвращает результаты следующего типа, если я запускаю его на MongoDB изначально(Я заполнил его некоторыми случайными данными):

{ "name" : "Event 3", "time" : NumberLong(3) }
{ "name" : "Abrakadabra", "time" : NumberLong(5) }

Этого недостаточно для перестройки сущности, и именно поэтому вы видите исключение.

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

List<Object[]> poems = em.createNativeQuery( queryString ).getResultList();

Hibernate OGM преобразует предыдущий результат в список массивов.Каждый элемент списка - это массив, в котором первое значение массива - это имя события, а второй - время.

Для поддерживаемых случаев, подобных этому, я думаю, что запросы HQL лучше.Вы можете переписать этот пример следующим образом:

    String queryString = 
            "SELECT e.name " +
            "FROM MySession s JOIN s.events e " +
            "WHERE e.name LIKE 'Abrakadabra'";
    List<Object[]> events = em.createQuery( queryString ).getResultList();

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

    String queryString = 
            "SELECT e.time, e.name " +
            "FROM MySession s JOIN s.events e " +
            "WHERE e.name LIKE 'Abrakadabra'";
    List<Object[]> events = em.createQuery( queryString ).getResultList();
0 голосов
/ 30 ноября 2018

Он не распознает сущность, убедитесь, что все ваши сущности находятся в persistence.xml Встраиваемые объекты тоже

<class>org.example.package.MySessionEvent</class>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...