Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hql查询到条件查询_Java_Sql_Hql_Criteria - Fatal编程技术网

Java Hql查询到条件查询

Java Hql查询到条件查询,java,sql,hql,criteria,Java,Sql,Hql,Criteria,我有一句话在HQL中是正确的: 字符串查询字符串= "SELECT gmr.id.expedientId.idEns as idEns," + " gmr.id.expedientId.anyExp as anyExp," + " gmr.id.expedientId.numExp as numExp," + " gmr.id.numOrdre as numOrdre," + " gmr.idRecu

我有一句话在HQL中是正确的:

字符串查询字符串=

"SELECT gmr.id.expedientId.idEns as idEns,"
            + " gmr.id.expedientId.anyExp as anyExp,"
            + " gmr.id.expedientId.numExp as numExp,"
            + " gmr.id.numOrdre as numOrdre,"
            + " gmr.idRecursRebuig.desRecursRebuig as descripcioRebuig,"
            + " gmr.desAmpliRebuig as observacionsRebuig,"
            + " gmr.tipusRebuig as tipusRebuig"
            + " FROM GirMotiuRebuig gmr"
            + " where gmr.id.expedientId.idEns =:idEns and"
            + " gmr.id.expedientId.anyExp =:anyExp and"
            + " gmr.id.expedientId.numExp =:numExp"
            + " ORDER BY gmr.id.numOrdre";

            Query queryObject = getSessionFactory().getCurrentSession()
                    .createQuery(queryString);

            queryObject.setResultTransformer(Transformers
                    .aliasToBean(MotiusRebuig.class));

            queryObject.setParameter("idEns",clauExpedient.getIdEns());
            queryObject.setParameter("anyExp",clauExpedient.getAnyExp());
            queryObject.setParameter("numExp",clauExpedient.getNumExp());

            llistaMotiusRebuig =queryObject.list();
以及我的标准版本:

Criteria consulta = this.getSessionFactory().getCurrentSession()
    .createCriteria(GirMotiuRebuig.class)
    .add(Restrictions.eq("id.expedientId.idEns", clauExpedient.getIdEns()))
    .add(Restrictions.eq("id.expedientId.anyExp", clauExpedient.getAnyExp()))
    .add(Restrictions.eq("id.expedientId.numExp", clauExpedient.getNumExp()))
    .addOrder(Order.asc("id.numOrdre"))
    .setProjection(Projections.projectionList()
    .add(Projections.property("id.expedientId.idEns"),"idEns")
    .add(Projections.property("id.expedientId.anyExp"),"anyExp")
    .add(Projections.property("id.expedientId.numExp"),"numExp")
    .add(Projections.property("id.numOrdre"),"numOrdre")
        .add(Projections.property("idRecursRebuig.desRecursRebuig"),"descripcioRebuig")
    .add(Projections.property("desAmpliRebuig"),"observacionsRebuig")
    .add(Projections.property("tipusRebuig"),"tipusRebuig")
    .add(Projections.property("expedientId.numOrdre"),"numOrdre"))
                .setResultTransformer(
                Transformers.aliasToBean(MotiusRebuig.class));
    llistaMotiusRebuig =  consulta.list();
例外情况:

Caused by: org.hibernate.QueryException: could not resolve property: idRecursRebuig.desRecursRebuig of: cat.base.gir.logica.domini.impl.GirMotiuRebuig
        at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
        at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
        at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1362)
        at org.hibernate.loader.criteria.CriteriaQueryTranslator.getType(CriteriaQueryTranslator.java:477)
        at org.hibernate.criterion.PropertyProjection.getTypes(PropertyProjection.java:36)
        at org.hibernate.criterion.AliasedProjection.getTypes(AliasedProjection.java:37)
        at org.hibernate.criterion.ProjectionList.getTypes(ProjectionList.java:38)
        at org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:318)
        at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:77)
        at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:59)
        at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:67)
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1550)
        at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
        at cat.base.gir.dao.GirMotiuRebuigDao.obtenirMotiusRebuig(GirMotiuRebuigDao.java:73)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy1183.obtenirMotiusRebuig(Unknown Source)
        at cat.base.gir.serveis.GirRecursService.obtenirMotiusRebuig(GirRecursService.java:381)
        ... 127 more
这个标准是有效的:

Criteria consulta = this.getSessionFactory().getCurrentSession()
                .createCriteria(GirMotiuRebuig.class, "g")
                    .add(Restrictions.eq("g.id.expedientId.idEns", clauExpedient.getIdEns()))
                    .add(Restrictions.eq("g.id.expedientId.anyExp", clauExpedient.getAnyExp()))
                    .add(Restrictions.eq("g.id.expedientId.numExp", clauExpedient.getNumExp()))
                    .addOrder(Order.asc("g.id.numOrdre"))
                .setProjection(Projections.projectionList()
                        .add(Projections.property("g.id.expedientId.idEns"),"idEns")
                        .add(Projections.property("g.id.expedientId.anyExp"),"anyExp")
                        .add(Projections.property("g.id.expedientId.numExp"),"numExp")
                        .add(Projections.property("g.desAmpliRebuig"),"observacionsRebuig")
                        .add(Projections.property("g.id.numOrdre"),"numOrdre")
                        .add(Projections.property("g.tipusRebuig"),"tipusRebuig")
                        )
                .setResultTransformer(
                        Transformers.aliasToBean(MotiusRebuig.class));
        llistaMotiusRebuig =  consulta.list();
但当我试图攻击“idrecursrubig.desrecursrubig as descrippciorebuig” 比如:

查询失败

nested exception is org.hibernate.QueryException: could not resolve property: idRecursRebuig.desRecursRebuig of: cat.base.gir.logica.domini.impl.GirMotiuRebuig
所以:问题是当我试图恢复体力时…所以…我需要额外的咖啡

这是mrecursrubig的映射:

@Entity
@Table(name = "MRecursRebuig")
public class MRecursRebuig implements IMRecursRebuig {

    /**
     * 
     */
    private static final long serialVersionUID = 7439723582297629986L;

    private Integer idRecursRebuig;
    private String desRecursRebuig;
    private Integer tipusRebuig;

    public MRecursRebuig() {
    }

    public MRecursRebuig(Integer idRecursRebuig, String desRecursRebuig) {
        this.idRecursRebuig = idRecursRebuig;
        this.desRecursRebuig = desRecursRebuig;
    }

    @Id
    @Column(name = "id_recurs_rebuig", unique = true, nullable = false, precision = 22, scale = 0)
    public Integer getIdRecursRebuig() {
        return idRecursRebuig;
    }

    public void setIdRecursRebuig(Integer idRecursRebuig) {
        this.idRecursRebuig = idRecursRebuig;
    }

    @Column(name = "des_recurs_rebuig", nullable = false, length = 100)
    public String getDesRecursRebuig() {
        return desRecursRebuig;
    }

    public void setDesRecursRebuig(String desRecursRebuig) {
        this.desRecursRebuig = desRecursRebuig;
    }

    @Column(name = "tipus_rebuig", nullable = false)
    public Integer getTipusRebuig() {
        return tipusRebuig;
    }
如果我试试这个:

Criteria consulta = this.getSessionFactory().getCurrentSession()
                    .createCriteria(GirMotiuRebuig.class, "g")
                    .createAlias("g.idRecursRebuig", "idRecursRebuig")
                        .add(Restrictions.eq("g.id.expedientId.idEns", clauExpedient.getIdEns()))
                        .add(Restrictions.eq("g.id.expedientId.anyExp", clauExpedient.getAnyExp()))
                        .add(Restrictions.eq("g.id.expedientId.numExp", clauExpedient.getNumExp()))
                        .add(Restrictions.eq("g.idRecursRebuig", clauExpedient.getNumExp()))
                        .addOrder(Order.asc("g.id.numOrdre"))
                    .setProjection(Projections.projectionList()
                            .add(Projections.property("g.id.expedientId.idEns"),"idEns")
                            .add(Projections.property("g.id.expedientId.anyExp"),"anyExp")
                            .add(Projections.property("g.id.expedientId.numExp"),"numExp")
                            .add(Projections.property("g.desAmpliRebuig"),"observacionsRebuig")
                            .add(Projections.property("g.id.numOrdre"),"numOrdre")
                            .add(Projections.property("g.tipusRebuig"),"tipusRebuig")
                            **.add(Projections.property("idRecursRebuig.desRecursRebuig"),"descripcioRebuig")**
                            )
                    .setResultTransformer(
                            Transformers.aliasToBean(MotiusRebuig.class));
            llistaMotiusRebuig =  consulta.list();
我收到:

nested exception is org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of cat.base.gir.logica.domini.impl.MRecursRebuig.idRecursRebuig
    cat.base.gir.serveis.GirRecursService.obtenirMotiusRebuig(GirRecursService.java:387)

在HQL查询中,当

select entityA.entityB.foo from EntityA entityA ...
实际上,您正在EntityA和EntityB之间创建一个隐式内部连接。相当于

select entityB.foo from EntityA entityA
inner join entityA.entityB entityB ...
在条件查询中,不能像在HQL中那样链接属性。相反,每次需要连接时,必须使用子标准或(我的首选)别名明确地创建它。所以你需要这样做

Criteria consulta = this.getSessionFactory().getCurrentSession()
    .createCriteria(GirMotiuRebuig.class, "girMotiuRebuig")
    .createAlias("girMotiuRebuig.id.expedientId", "expedient") 
    .add(Restrictions.eq("expedient.idEns", clauExpedient.getIdEns()))
    ...

请注意,您的设计和命名使代码难以理解。你应该尽量避免使用复合键,也不应该给实际上是mrecursrubig实例的字段命名
idrecursrubig

Criteria consulta = this.getSessionFactory().getCurrentSession()
                    .createCriteria(GirMotiuRebuig.class, "g")
                    .createAlias("idRecursRebuig", "i")
                        .add(Restrictions.eq("g.id.expedientId.idEns", clauExpedient.getIdEns()))
                        .add(Restrictions.eq("g.id.expedientId.anyExp", clauExpedient.getAnyExp()))
                        .add(Restrictions.eq("g.id.expedientId.numExp", clauExpedient.getNumExp()))
                        .addOrder(Order.asc("g.id.numOrdre"))
                    .setProjection(Projections.projectionList()
                            .add(Projections.property("g.id.expedientId.idEns"),"idEns")
                            .add(Projections.property("g.id.expedientId.anyExp"),"anyExp")
                            .add(Projections.property("g.id.expedientId.numExp"),"numExp")
                            .add(Projections.property("g.desAmpliRebuig"),"observacionsRebuig")
                            .add(Projections.property("g.id.numOrdre"),"numOrdre")
                            .add(Projections.property("g.tipusRebuig"),"tipusRebuig")
                            .add(Projections.property("i.desRecursRebuig"),"descripcioRebuig")
                            )
                    .setResultTransformer(
                            Transformers.aliasToBean(MotiusRebuig.class));
            llistaMotiusRebuig =  consulta.list();

当我们甚至不知道GirMotureBuig类是否包含DesRecurseReBuig属性时,很难说什么。可能请先检查是否存在这样的属性…hql语句可以工作,但不在条件中…所以属性存在,可能我不理解它是如何工作的..交换
.add(Projections.property(“idRecursRebuig.desRecursRebuig”),“descripcioRebuig”)
.add(Projections.property(“desAmpliRebuig”),“observacionsRebuig”)
,运行它,告诉我们输出是否有任何变化。同样的错误…wtf…ty,谢谢你的时间。很抱歉,很难理解,明天我会改变。
Criteria consulta = this.getSessionFactory().getCurrentSession()
    .createCriteria(GirMotiuRebuig.class, "girMotiuRebuig")
    .createAlias("girMotiuRebuig.id.expedientId", "expedient") 
    .add(Restrictions.eq("expedient.idEns", clauExpedient.getIdEns()))
    ...
Criteria consulta = this.getSessionFactory().getCurrentSession()
                    .createCriteria(GirMotiuRebuig.class, "g")
                    .createAlias("idRecursRebuig", "i")
                        .add(Restrictions.eq("g.id.expedientId.idEns", clauExpedient.getIdEns()))
                        .add(Restrictions.eq("g.id.expedientId.anyExp", clauExpedient.getAnyExp()))
                        .add(Restrictions.eq("g.id.expedientId.numExp", clauExpedient.getNumExp()))
                        .addOrder(Order.asc("g.id.numOrdre"))
                    .setProjection(Projections.projectionList()
                            .add(Projections.property("g.id.expedientId.idEns"),"idEns")
                            .add(Projections.property("g.id.expedientId.anyExp"),"anyExp")
                            .add(Projections.property("g.id.expedientId.numExp"),"numExp")
                            .add(Projections.property("g.desAmpliRebuig"),"observacionsRebuig")
                            .add(Projections.property("g.id.numOrdre"),"numOrdre")
                            .add(Projections.property("g.tipusRebuig"),"tipusRebuig")
                            .add(Projections.property("i.desRecursRebuig"),"descripcioRebuig")
                            )
                    .setResultTransformer(
                            Transformers.aliasToBean(MotiusRebuig.class));
            llistaMotiusRebuig =  consulta.list();