Класс Crieria.Root не может получить атрибут Local, который является атрибутом составного ключа - PullRequest
0 голосов
/ 09 мая 2019

У меня есть файлы Entity class UniversityBasicInformation.java и UniversityBasicInformation.hbm.xml. Я хочу написать критерий запроса. Я получаю ошибку в root.get("surveyYear"), surveyYear) в моем коде.

Ошибка говорит о том, что

Java.lang.illegalArgumentsException: невозможно найти локальный атрибут с данным именем года опроса.

При отладке я обнаружил, что атрибуты составного ключа не могут быть идентифицированы JPA.

public class UniversityBasicInformation implements Serializable{        
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @JsonProperty
    private String aisheCode;
    @JsonProperty
    private Integer surveyYear;
    @JsonProperty
    private String state;
    @JsonProperty
    private String name;
    @JsonProperty
    private String district;
    @JsonProperty
    private String type;
}
<hibernate-mapping>
    <class name="gov.nic.aishe.read.pojo.UniversityBasicInformation" table="university_basic_information"
        schema="readonly">
        <composite-id>
            <key-property name="aisheCode" type="java.lang.String">
                <column name="aishe_code" />
            </key-property>
            <key-property name="surveyYear" type="java.lang.Integer">
                <column name="survey_year" />
            </key-property>
        </composite-id>
        <property name="state" type="java.lang.String">
            <column name="state" />
        </property>
        <property name="district" type="java.lang.String">
            <column name="district" />
        </property>
        <property name="type" type="java.lang.String">
            <column name="type" />
        </property>        
    </class>

</hibernate-mapping>
public List<UniversityBasicInformation> getUniversityList(Integer surveyYear, String stateCode, String type,
        String speciality, String districtCode) {

    CriteriaBuilder builder = sessionFactory.getCurrentSession().getCriteriaBuilder();
    CriteriaQuery<UniversityBasicInformation> criteriaQuery = builder.createQuery(UniversityBasicInformation.class);
    Root<UniversityBasicInformation> root = criteriaQuery.from(UniversityBasicInformation.class);


    List<Predicate> predicates = new ArrayList<Predicate>();

    predicates.add(builder.equal(root.get("surveyYear"), surveyYear)); //line with error

    if (stateCode != null) {

        predicates.add(builder.equal(root.get("state"), stateCode));

    }

Я ожидаю, что значение параметра года обследования будет добавлено в качестве предиката. Но приведенный выше код выдает ошибку, так как не может найти локальный атрибут с заданным именем [surveyYear]

1 Ответ

0 голосов
/ 15 мая 2019

Кажется, вы выбрали обескураженное отображение.https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html#mapping-declaration-compositeid

К сожалению, этот подход означает, что постоянный объект имеет свой собственный идентификатор.Не существует удобной «ручки», кроме самого объекта.Вы должны создать экземпляр самого постоянного класса и заполнить его свойства идентификатора, прежде чем сможете загрузить () постоянное состояние, связанное с составным ключом.Мы называем этот подход встроенным составным идентификатором и не рекомендуем его для серьезных приложений.

Постоянный класс должен переопределять equals () и hashCode () для реализации равенства составного идентификатора.Он также должен реализовывать Serializable.

Чтобы выполнить поиск по всему ключу, вам необходимо переопределить equals() и передать все UniversityBasicInformation в

predicates.add(builder.equal(root, anUniversityBasicInformation));

Я также отлажен org.hibernate.query.criteria.internal.path.AbstractFromImpl.locateManagedType() и ни id, ни его частей нет в модели.Понятно, что это не то, что нам нужно.

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

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/components.html#components-compositeid

Кроме того, вы застряли с XML-отображением?Аннотации распространены в наши дни.

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