Java 预期位置参数计数:2,实际参数:

Java 预期位置参数计数:2,实际参数:,java,hibernate,Java,Hibernate,大家好,我尝试执行代码时出现异常: 另外,请告诉我如何传递参数以进行查询或使用 我的刀: @Override public Institution findWIthTwoParam(String name, Date mydate) { return (Institution)sessionFactory.getCurrentSession().createQuery( "select i from Institution i where

大家好,我尝试执行代码时出现异常: 另外,请告诉我如何传递参数以进行查询或使用

我的刀:

@Override
    public Institution findWIthTwoParam(String name, Date mydate) {         
      return (Institution)sessionFactory.getCurrentSession().createQuery(
         "select i from Institution i where i.nameOfInstitution =? and i.creationDate=?")
         .setString(0, name)
         .setParameter(1, mydate).uniqueResult();

    }
我的异常堆栈:

Exception in thread "main" org.hibernate.QueryException: Expected positional parameter count: 2, actual parameters: [MyIstitution, Tue Apr 27 00:00:00 EST 17] [select i from Institution i where i.nameOfInstitution =? and i.creationDate=?]
    at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:366)
    at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:322)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:98)
    at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:890)
    at edu.demidov.dao.InsertDataService.findWIthTwoParam(InsertDataService.java:106)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy25.findWIthTwoParam(Unknown Source)
    at edu.demidov.dao.AppTEst.main(AppTEst.java:76)
我的实体:

@Entity
@Table(name="INSTITUTION")
public class Institution implements Serializable{


    private static final long serialVersionUID = -7636394097858726922L;

            @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="INSTITUTION_ID")
    private int institutionId;


        @Version
        @Column(name="VERSION")
    private int version;


            @Column(name="NAME_INSTITUTION")
    private String nameOfInstitution;


                 @Column(name="TYPE_NAME")
    private String typeName;


        @ManyToMany(mappedBy="institution", fetch = FetchType.LAZY)
        @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private Set<CreationDate> creationDate = new HashSet<CreationDate>();

        //getter and setter methods ommited

        public String toString() {
            return institutionId + " , " + nameOfInstitution + " , " + typeName 
        }       
}
@实体
@表(name=“机构”)
公共类机构实现可序列化{
私有静态最终长serialVersionUID=-7636394097858726922L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“机构ID”)
私人int机构ID;
@版本
@列(name=“VERSION”)
私有int版本;
@列(name=“name\u机构”)
机构的私有字符串名称;
@列(name=“TYPE\u name”)
私有字符串类型名;
@ManyToMany(mappedBy=“institution”,fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private Set creationDate=new HashSet();
//getter和setter方法不匹配
公共字符串toString(){
返回institutionId+“,“+nameOfInstitution+”,“+typeName”
}       
}
我的实体二:

@Entity
@Table(name="CREATION_DATE")
public class CreationDate implements Serializable {


    private static final long serialVersionUID = 1648102358397071136L;

                 @Id
        @GeneratedValue(strategy=IDENTITY)
        @Column(name="DATE_ID")
    private int dateId;


        @Column(name="PARTICULAR_DATE")
    private Date particularDate;


            @Version
        @Column(name="VERSION")
    private int version;


        @Temporal(TemporalType.DATE)
        @Column(name="CHILD_GO_SCHOOL_DATE")
    private Date childGoSchoolDate;


        @Temporal(TemporalType.DATE)
        @Column(name="CHILD_ADMISSION_DATE")
    private Date childAdmissionDate;


        @ManyToMany(fetch = FetchType.LAZY)
        @Cascade(org.hibernate.annotations.CascadeType.ALL)
        @JoinTable(name="CREATIONDATE_INSTITUTION", 
                                    joinColumns=@JoinColumn(name="DATE_ID"), 
                                    inverseJoinColumns=@JoinColumn(name="INSTITUTION_ID"))
    private Set<Institution> institution = new HashSet<Institution>();


                      @OneToMany(fetch=FetchType.EAGER, orphanRemoval=true)
        @Cascade(org.hibernate.annotations.CascadeType.ALL)
        @JoinTable(name="SRC_DATE", joinColumns=@JoinColumn(name="DATE_ID"),
                    inverseJoinColumns=@JoinColumn(name="SRC_ID"))
    private List<ScheduleRotationChild> scheduleRotationChild = new ArrayList<ScheduleRotationChild>();


        //getter and setter methods ommited


        public String toString() {

            return  dateId + " , " 
            + particularDate + " , " 
            + childGoSchoolDate + " , " 
            + childAdmissionDate + "  " + scheduleRotationChild ;

        }

}
@实体
@表(name=“创建日期”)
公共类CreationDate实现了可序列化{
私有静态最终长serialVersionUID=1648102358397071136L;
@身份证
@生成值(策略=标识)
@列(name=“DATE\u ID”)
私有数据ID;
@列(name=“特定日期”)
私人约会;
@版本
@列(name=“VERSION”)
私有int版本;
@时态(TemporalType.DATE)
@列(name=“儿童入学日期”)
私人约会孩子选择日期;
@时态(TemporalType.DATE)
@列(name=“儿童入学日期”)
私人日期儿童入院日期;
@ManyToMany(fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@JoinTable(name=“CREATIONDATE_INSTITUTION”,
joinColumns=@JoinColumn(name=“DATE\u ID”),
inverseJoinColumns=@JoinColumn(name=“INSTITUTION\u ID”))
private Set institution=new HashSet();
@OneToMany(fetch=FetchType.EAGER,orphan=true)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@JoinTable(name=“SRC\u DATE”,joinColumns=@JoinColumn(name=“DATE\u ID”),
inverseJoinColumns=@JoinColumn(name=“SRC_ID”))
私有列表scheduleRotationChild=新ArrayList();
//getter和setter方法不匹配
公共字符串toString(){
返回日期ID+“,”
+特定日期“,”
+childGoSchoolDate+“,”
+ChildApprovisionDate+“”+scheduleRotationChild;
}
}

请帮我解决它

您的
creationDate
是一个集合,因此您需要加入。集合本身包含
CreationDate
的实例,而不是日期

最后,它看起来是这样的:

select i from Institution i JOIN i.creationDate d where i.nameOfInstitution =? and d.particularDate=?

我想参数索引是从1开始的(不是0)@hoaz我可以支持你,这是事实,它确实是从1开始的。谢谢你的回答。我试着照你们说的做,异常仍然发生在线程“main”org.hibernate.hql.ast.QuerySyntaxException中异常:预期加入的路径![从edu.demidov.dom.Institution中选择i,我加入creationDate d,其中i.nameOfInstitution=?和d.SpecialDate=?]非常感谢Jimmy,我已经这么做了。。。我为我愚蠢的重播感到抱歉。。。你知道我还是很好奇我做对了吗。。听着,我必须输入实体,我想把我的方法传递给参数,每个实体的每个参数,然后把它们放到查询中。我做得对吗?或者我应该考虑一些类似标准的查询。您能帮帮我吗。@VadimDemidov您的意思是
查找WithTwoParam()
?是的,先生。如果你能给我点时间的话。我想问你。我怎样才能用更好的风格做到这一点呢?只需将参数传递给我的方法,并提取与参数对应的数据???@vadimdemodov当前解决方案的问题是什么?