Hibernate OGM с MongoDB не может разрешить свойство - PullRequest
0 голосов
/ 26 апреля 2018

Этот запрос HQL выдает ошибку:

String q4 = "SELECT i, COUNT(ie) FROM CorsoStudi cs \n"
            + "\t JOIN cs.inserogati ie JOIN ie.insegn i \n"      
            + "\t WHERE cs.nome = 'Laurea in Informatica' \n"
            + "\t GROUP BY i"; 

Ошибка:

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: insegn. of: component[_id,annierogazione,annoaccademico,crediti,discriminante,discriminantemodulo,hamoduli,id_facolta,insegn,inserogato_padre,modulo,nomemodulo,nomeunita,programma] 

Это InsErogato:

@Embeddable 
public class InsErogato { 

    private Integer _id; 

    private String annoaccademico; 

    @Embedded 
    private Insegn insegn; 

    @Embedded
    private Discriminante discriminante; 

    private Integer modulo;  

    private String discriminantemodulo; 

    private String nomemodulo; 

    private Double crediti; 

    private String programma; 

    private Integer id_facolta; 

    private String hamoduli;  

    @Embedded 
    private InsErogatoPadre inserogato_padre; 

    private String nomeunita; 

    private Integer annierogazione; 

    // constructors, getters and setters and toString  
}  

а это Инсегн:

@Embeddable
public class Insegn { 

    private Integer _id; 

    private String nomeins;  

    private String codiceins; 

    // constructors, getters and setters and toString 
}  

Основной:

// begin transaction 
entityManager.getTransaction().begin();  

List<Object[]> insegn = entityManager
        .createQuery(q4, Object[].class) 
        .getResultList(); 

for(Object[] i : insegn) {
    Insegn ins = (Insegn)i[0]; 
    Long count = (Long)i[1]; 

    System.out.println("nomeins: " + ins.getNomeins() + ", numero inserogati: " + count); 
}  

// commit transaction
entityManager.getTransaction().commit();  

Структура MongoDB:

https://i.stack.imgur.com/qFusC.jpg  
https://i.stack.imgur.com/k04HK.png
https://i.stack.imgur.com/H8nhS.png
https://i.stack.imgur.com/eYl2M.png 

Я пытался изменить запрос, но Hibernate не находит свойство "insegn" (а также "criminante ") в" inserogato ", но он может найти из него другие простые атрибуты (например," annoaccademico "и т. Д.).

Тот же запрос работает в Hibernate ORM с PostgreSQL.

Может быть, мне нужно что-то добавить в аннотации или изменить структуру mongoDB (?).

Я использую Hibernate OGM 5.3.1.Final и драйвер JDBC MongoDB 3.6.3.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

В настоящее время запросы с group by не поддерживаются. Вам нужно будет выполнить собственный запрос MongoDB для этого конкретного варианта использования. Подробнее см. справочную документацию .

Я думаю, что объединение встроенной сущности вместо коллекции сбивает с толку синтаксический анализатор, даже если это правильный запрос. Вы должны увидеть более четкое исключение со следующим (эквивалентно тому, которое вы пытаетесь):

SELECT ie.i, COUNT(ie)
FROM CorsoStudi cs
    JOIN cs.inserogati ie
WHERE cs.nome = 'Laurea in Informatica'
GROUP BY ie.i;

Стоит выбросить:

java.lang.UnsupportedOperationException: The GROUP BY clause is not supported

Агрегатные функции также не поддерживаются.

0 голосов
/ 27 апреля 2018

Тот же запрос работает в Hibernate ORM с PostgreSQL

Но PostgreSQL - это база данных SQL, MongoDB - это база данных NoSQL. Hibernate OGM - это средство для добавления Hibernate ORM в базы данных NoSQL. «(H) SQL» для OGM ограничен (см. Ниже).

Вы не говорите, на чем развернуто ваше приложение. Я использую WildFly 12.0.0.Final. У меня был OGM с MongoDB, работающей над версией 11 и 12.

.

entityManager.getTransaction () начинается ();

Я использую контейнер (WildFly) для обработки транзакций. Аннотируйте мой EJB.

@TransactionManagement(TransactionManagementType.CONTAINER)

Я не думаю, что вы можете использовать (H) SQL как таковой с Hiberate OGM, но:

Использовать JPQL - пока только для простых запросов

Использовать собственный запрос NoSQL, отображающий результат как управляемые объекты

Использование поисковых запросов Hibernate - преимущественно полнотекстовых запросов

В документации сказано:

В частности, обратите внимание, что не поддерживается:

объединение перекрестных сущностей

JPQL-функции, в частности функции агрегирования, такие как count

Обновление и удаление запросов JPQL

Один из моих запросов:

Query query = mongoDBEntityManager.createQuery("FROM FoodsCosmeticsMedicines f WHERE f.ean = :ean")
                .setParameter("ean", ean);

Сущность (@Expose для JSON)

@Entity(name = "FoodsCosmeticsMedicines")
@Indexed
@Table(name = "foodsCosmeticsMedicines")
public class FoodsCosmeticsMedicines implements Serializable {

    // Arrays of Objects
    @Expose(deserialize = true, serialize = true)
    @Embedded
    ProductCharacteristics productCharacteristics;
    @Expose(deserialize = true, serialize = true)
    @Embedded
    CalcNutrition calcNutrition;
    @Expose(deserialize = true, serialize = true)
    @Embedded
    Nutrients nutrients;
    @Expose(deserialize = true, serialize = true)
    @Embedded
    Enumbers enumbers;
    @Expose(deserialize = true, serialize = true)
    @Embedded
    ChemicalsMineralsVitamins chemicalsMineralsVitamins;
    @Expose(deserialize = true, serialize = true)
    @Embedded
    Lifestyle lifestyle;
    .....
}

Почему вы используете JOIN?

С MySQL я использую Hibernate в качестве своего ORM, я бы использовал аннотации для отображения отношений с такими объектами, как:

@OneToOne(cascade = CascadeType.ALL, mappedBy = "product", fetch = FetchType.LAZY)
private UriEntity uri;

entityManager.getTransaction () фиксации ();. * * Тысяча пятьдесят-дв

Это не имеет значения, так как все, что вы сделали, это прочитали. Может быть, вы исключили персистирование?

Я уверен, что вы прочитали документацию. Я нашел все ответы на проблемы, с которыми я столкнулся здесь:

Hibernate OGM 5.3.1. Финал: Справочное руководство

...