I have Entity class UniversityBasicInformation.java and UniversityBasicInformation.hbm.xml files. I want to write a criteria query. I am getting error at root.get("surveyYear"), surveyYear)
in my code.
The error says that
Java.lang.illegalArgumentsException: unable to find local attribute with the given name survey year.
On Debug I identified that Composite key attributes are unable to be identified by 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));
}
I expect that survey year parameter value to be added as predicate. But the above code is giving error as unable to find local attribute with given name [surveyYear]