JPA 2.1 @SqlResultSetMapping связывает внутренний класс с целевым классом

можно ли сопоставить внутренние классы с targetclass, если возможно, как это сделать? Я новичок в этой @SqlResultSetMapping функциональности:

@SqlResultSetMapping(
        name = "EventSurveysMapping",
        classes = {
                @ConstructorResult(
                        targetClass = Survey.class,
                        columns = {
                                @ColumnResult(name = "surveyid", type = Long.class),
                        })
        })

Итак, targetClass Survey.class имеет:

public class Survey {
    private Long surveyid;
    private List<SurveyQuestion> surveyquestions;
// constructor with mapped fields
}

Как мне отобразить поле List<SurveyQuestion>?

ОпросВопрос:

public class SurveyQuestion {
    private Long surveyquestionid;
    private String surveyquestion;
    private List<String> surveyanswers;
}

Тоже и очень похоже. Как мне отобразить List<String> ?

Я получаю исключение при попытке сделать сопоставление с List.class:

@SqlResultSetMapping(
        name = "EventPollsMapping",
        classes = {
                @ConstructorResult(
                        targetClass = Poll.class,
                        columns = {
                                @ColumnResult(name="pollid", type = Long.class),
                                @ColumnResult(name="questionid", type = Long.class),
                                @ColumnResult(name="pollquestion", type = String.class),
                                @ColumnResult(name="pollanswers", type = List.class) // this mapping is the cause of the exception
                        })
        })

Исключение:

org.eclipse.persistence.exceptions.ConversionException Описание исключения: объект [это основной идентификатор, это уникальный идентификатор] класса [класс java.lang.String] не может быть преобразован в [интерфейс java.util.List]

Опрос:

@XmlRootElement
@XmlType (propOrder={"pollid",
"pollquestionid",
"pollquestion",
"pollanswers"
})
public class Poll {
    private Long pollid;
    private Long pollquestionid;
    private String pollquestion;
    private List<String> pollanswers;


    public Poll(){}

    public Poll(Long pollid, Long pollquestionid, String pollquestion, List<String> pollanswers) {
        super();
        this.pollid = pollid;
        this.pollquestionid = pollquestionid;
        this.pollquestion = pollquestion;
        this.pollanswers = pollanswers;
    }

// setters & getters 
}

person esteban rincon    schedule 21.04.2017    source источник
comment
Не могли бы вы показать код класса Poll + относительные сопоставления, используемые для Survey и SurveyQuestion?   -  person O.Badr    schedule 09.05.2017
comment
Просто чтобы уточнить, импл. EclipseLink не Hibernate.   -  person esteban rincon    schedule 09.05.2017
comment
@O.Badr, добавлен класс опроса. Сопоставление для опроса и опроса уже есть.   -  person esteban rincon    schedule 09.05.2017
comment
Можете ли вы указать запрос, используемый для сопоставления с целевым классом (например, EventSurveysMapping)?   -  person O.Badr    schedule 10.05.2017
comment
У меня аналогичное требование. Вы нашли способ сделать это?   -  person Charvee Shah    schedule 02.11.2020
comment
@CharveeShah, эй, по правде говоря, я не помню. Я думаю, что я просто использовал простой JDBC, но дайте мне проверить   -  person esteban rincon    schedule 02.11.2020


Ответы (1)


По моему опыту, когда мне нужно было отобразить коллекцию вещей, я, наконец, сделал что-то вроде этого:

@OneToMany
private Set<SurveyQuestion> surveyanswers;

Все это, если вы используете расширение вашего провайдера JPA, поддерживающее набор базовых типов. (например, Hibernate имеет аннотацию @CollectionOfElements).

person Damián Rafael Lattenero    schedule 08.05.2017
comment
Hibernate @CollectionOfElements заменяется на @ElementCollection - person O.Badr; 09.05.2017
comment
Спасибо за ваш ответ, но это не имеет большого отношения к моему вопросу, @ConstructorResult используется с НЕ сущностями. - person esteban rincon; 09.05.2017