java - 实体在映射时如何获取非主键值?

标签 java hibernate spring-mvc exception

AssignCoScholastic.java

@Entity
    @Table(name="assignCoScholastic")
    public class AssignCoScholastic 
    {
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private int assginCoScholasticId;
        @ManyToOne
        @JoinColumn(name="assignClassId")
        private AssignClass assignClass;
        @ManyToOne
        @JoinColumn(name="coscholasticId")
        private CoScholastic coscholastic;
        @ManyToOne
        @JoinColumn(name="subCoScholasticId")
        private SubCoScholasticActivity subCoScholasticActivity;
        private String year;
        @ManyToOne
        @JoinColumn(name="school_id")
        private SchoolModel schoolModel;

CoScholastic.java

@Entity
@Table(name="coscholastic")
public class CoScholastic {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int coScholasticId;
    @Column(name="Coscholastic_Name")
    private String coscholasticName;
    // Getters and Setters

实现:

@Override
    public List<Object[]> listOfAssignCoScholastics(int assiginedClass, int schoolId, String year) {
        Session session=sessionFactory.openSession();
        session.beginTransaction();
        List<Object[]> listOfAssignCoScholastics=new ArrayList<Object[]>();
        try
        {
        Criteria criteria=session.createCriteria(AssignCoScholastic.class);
        criteria.setProjection(Projections.property("coscholastic.coScholasticId"));
        criteria.setProjection(Projections.property("coscholastic.coscholasticName"));
        criteria.add(Restrictions.eq("assignClass.assignID", assiginedClass));
        criteria.add(Restrictions.eq("schoolModel.school_id", schoolId));
        criteria.add(Restrictions.like("year", year));
        listOfAssignCoScholastics=criteria.list();
        session.getTransaction().commit();
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            session.close();
            sessionFactory.close();
        }
        return listOfAssignCoScholastics;
    }

我正在尝试执行上面的代码并遇到异常。

什么是org.hibernate.QueryException:无法解析属性:以及如何解决它?

异常(exception):

org.hibernate.QueryException: could not resolve property: coscholastic.coscholasticName of: com.slv.model.AssignCoScholastic
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81)
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75)
at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1465)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getType(CriteriaQueryTranslator.java:547)
at org.hibernate.criterion.PropertyProjection.getTypes(PropertyProjection.java:60)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:362)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:100)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:92)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1697)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
at com.slv.daoimpl.RegistrationDaoImpl.listOfAssignCoScholastics(RegistrationDaoImpl.java:1907)
at com.slv.controller.SchoolController.loadAssignCoscholastic(SchoolController.java:920)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

最佳答案

您需要告诉 hibernate 您需要哪个类属性。这就像您在 sql 查询中编写的连接。

试试这个方法

Criteria criteria=session.createCriteria(AssignCoScholastic.class,"assignCoScholastic");
criteria.createAlias("assignCoScholastic.coscholastic", "coscholastic");
criteria.createAlias("assignCoScholastic.assignClass", "assignClass");
criteria.createAlias("assignCoScholastic.schoolModel", "schoolModel");
criteria.setProjection(Projections.property("coscholastic.coScholasticId"));
criteria.setProjection(Projections.property("coscholastic.coscholasticName"));
criteria.add(Restrictions.eq("assignClass.assignID", assiginedClass));
criteria.add(Restrictions.eq("schoolModel.school_id", schoolId));//school_id is the property in class schoolModel
criteria.add(Restrictions.like("assignCoScholastic.year", year));

听说classAliasHavingYear是为具有年份属性的类创建的别名。

你的其余代码...

关于java - 实体在映射时如何获取非主键值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36595749/

相关文章:

java - 在使用反射实现向后兼容性方面需要帮助

hibernate - 集群的独立/复制 Ehcache

java - 使用 spring 进行 Json 正文整数验证

json - Spring 休息: HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8'

java - Java String REGEX 识别 DOI 的正确格式是什么

Java EE @Schedule 和服务器关闭

java - 将数组的输出格式化为列

java - 当在复合键中使用时,JPA AttributeConverter 在 Spring-data/hibernate 查询中不被接受

java - 客户端集群数据库与 Hibernate 同步

java - Spring 安全 : Multiple HTTP Config not working