У меня есть файлы 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]