【问题标题】:Hibernate Exception - could not locate named parameter休眠异常 - 找不到命名参数
【发布时间】:2015-09-13 16:08:24
【问题描述】:

我正在尝试从实体(表)StudySeries 中从数据库中提取对象列表:

@Entity 
@Table(name="StudySeries", uniqueConstraints = {
@UniqueConstraint(columnNames = "SeriesInstanceUID")})
public class StudySeries implements Serializable {
    ...
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "SeId", unique = true, nullable = false)
    private Long seId;

    @Column(name="SeriesInstanceUID", unique=true, nullable = false)
    private String seriesInstanceUID;
    ...
    @ManyToOne
    @JoinColumn(name = "StId", referencedColumnName="StId")
    private StudyDetails studyDetails;
    ...
}

这个实体是 N-1 加入 StudyDetails 的(在 StudyDetails 上有很多 StudySeries):

@Entity
@Table(name="StudyDetails", uniqueConstraints = @UniqueConstraint(columnNames = "StudyInstanceUID"))
public class StudyDetails implements Serializable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name="StId", unique = true, nullable = false)
    private Long stId;

    @Column(name="StudyInstanceUID", unique=true, nullable = false)
    private String studyInstanceUID;
    ...
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "studyDetails", cascade = CascadeType.ALL)
    private Set<StudySeries> studySeries = new HashSet<StudySeries>(0);
    ...
}

在我的 StudySeriesDAOImpl() 中,我试图:

@Override
public List<StudySeries> getStudySeriesObjectsByStudyId(Long stId) {

    List<StudySeries> results=new ArrayList<>();
    Session s=HibernateUtil.openSession();
    s.beginTransaction();
    String hql = "from StudySeries E where E.studyDetails.stId = stId";
    Query query = s.createQuery(hql);
    query.setParameter("stId", stId);
    results = query.list();
    s.getTransaction().commit();
    s.close();
    log.info(">>>>> list size: " + results.size());        

    return results;
}

我也尝试过 hql 查询:

String hql = "from StudySeries E where E.stId = stId";

但是我得到了:

org.hibernate.QueryParameterException: could not locate named parameter [stId]
at org.hibernate.engine.query.spi.ParameterMetadata.getNamedParameterDescriptor(ParameterMetadata.java:100) at org.hibernate.engine.query.spi.ParameterMetadata.getNamedParameterDescriptor(ParameterMetadata.java:100)
at org.hibernate.engine.query.spi.ParameterMetadata.getNamedParameterExpectedType(ParameterMetadata.java:106)
at org.hibernate.internal.AbstractQueryImpl.determineType(AbstractQueryImpl.java:466)
at org.hibernate.internal.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:436)
at com.npap.dao.StudySeriesDAOImpl.getStudySeriesObjectsByStudyId(StudySeriesDAOImpl.java:239)

有什么想法吗?

【问题讨论】:

  • where E.studyDetails.stId =: stId.
  • 哎呀!你是对的......在查询中忘记了“:”...... pffff......
  • “:”也必须紧跟在参数名称之前!即没有空格

标签: java hibernate jakarta-ee jpa hibernate-criteria


【解决方案1】:

在 StudySeries 类中,id 被命名为“seId”,而不是“stId”。 你应该这样做: String hql = "from StudySeries E where E.seId = stId";

【讨论】:

  • 不,我想在 where 子句中使用外键 stId。看看 StudySeries 实体上的@ManyToOne 注解
  • 好的,我找到了。错误是您忘记在查询中使用冒号 = :。你应该做 String hql = "from StudySeries E where E.studyDetails.stId = :stId";如果你不使用 : 它将找不到参数。
猜你喜欢
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 2013-02-21
  • 2020-03-10
  • 2012-12-27
  • 2011-02-14
  • 1970-01-01
相关资源
最近更新 更多