Java 为什么这个Hibernate JPQL查询可以';不行?
我对Hibernate和JPQL查询非常陌生,在尝试启动以下查询时遇到了一些问题。情况如下,我有: 1) 一个名为KMCountryArea的实体类,用于映射我的数据库上的KMCountryArea表:Java 为什么这个Hibernate JPQL查询可以';不行?,java,sql,spring,hibernate,jpql,Java,Sql,Spring,Hibernate,Jpql,我对Hibernate和JPQL查询非常陌生,在尝试启动以下查询时遇到了一些问题。情况如下,我有: 1) 一个名为KMCountryArea的实体类,用于映射我的数据库上的KMCountryArea表: @NamedQueries({ //@NamedQuery(name = "kmCountryListByName", query = "SELECT c FROM KMCountryArea c WHERE c.nomeFolder = :nomeFolder order b
@NamedQueries({
//@NamedQuery(name = "kmCountryListByName", query = "SELECT c FROM KMCountryArea c WHERE c.nomeFolder = :nomeFolder order by c.idCountryArea")
@NamedQuery(name = "kmCountryListByName", query = "SELECT c FROM KMCountryArea c WHERE c.nomeFolder = :nomeFolder order by c.idCountryArea")
})
/*@NamedQuery(name = "kmCountryListByName", query = "SELECT country FROM KMCountryArea country WHERE country.nomeFolder = :nomeFolder order by country.idCountry")*/
@Entity
@Table(name = "KM_COUNTRY_AREA")
public class KMCountryArea implements Serializable {
@Id
@GeneratedValue
private Long idCountryArea;
@Column(name = "nomeFolder")
private String nomeFolder;
//@Column(name = "country")
//@OneToOne(mappedBy = "country", cascade = CascadeType.ALL)
@OneToOne
private KMCountry country;
public Long getIdCountryArea() {
return idCountryArea;
}
public void setIdCountryArea(Long idCountryArea) {
this.idCountryArea = idCountryArea;
}
public String getNomeFolder() {
return nomeFolder;
}
public void setNomeFolder(String nomeFolder) {
this.nomeFolder = nomeFolder;
}
public KMCountry getCountry() {
return country;
}
public void setCountry(KMCountry country) {
this.country = country;
}
}
如您所见,此类和相关表格只有3个字段:
- 行id:
@Id @GeneratedValue private Long idCountryArea;
@NamedQuery(name = "kmCountryListByName", query = "SELECT c FROM KMCountryArea c WHERE c.nomeFolder = :nomeFolder order by c.idCountryArea")
- 与表上的nomeFolder列匹配的nomeFolder字符串:
@Column(name = "nomeFolder") private String nomeFolder;
- KMCountry-country表示与我的项目中定义的另一个KMCountry实体类的一对一关系,该实体类本身已将该字段定义为id私有长idCountry强>
@OneToOne private KMCountry country;
COLUMN NAME DATA_TYPE NULLABLE DATA_DEFAULT COLUMN_ID
--------------------------------------------------------------------------------
IDCOUNTRYAREA NUMBER(19,0) No (null) 1
NOMEFOLDER VARCHAR2(255 CHAR) Yes (null) 2
COUNTRY_IDCOUNTRY NUMBER(19,0) Yes (null) 3
我认为这是正确的,因为在我看来,定义到KMCountryArea实体类中的3个字段在kmu COUNTRY表中正确映射
因此,我在KM_COUNTRY表中手动插入了一行(通过插入查询,并执行这个简单的select查询(在Oracle SQL Developer(即DBMS IDE)中):
我得到以下正确结果:
IDCOUNTRYAREA NOMEFOLDER COUNTRY_IDCOUNTRY
------------------------------------------------------------
2 BRAZIL 715
现在,我必须使用JPQL执行类似此查询的操作,但要获得一组行(在前一种情况下,它只有一行,但我可以获得更多行),我希望获得定义id(在实体内部)等于COUNTRY\u IDCOUNTRY值的KMCountry对象的列表
如您所见,我实现了这个名为JPQL的查询:
@Id
@GeneratedValue
private Long idCountryArea;
@NamedQuery(name = "kmCountryListByName", query = "SELECT c FROM KMCountryArea c WHERE c.nomeFolder = :nomeFolder order by c.idCountryArea")
然后,在我的项目中,我定义了执行前面查询的DAO服务,实现了这个具体类:
@Repository("kmCountryAreaService")
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public class KMCountryAreaServiceImpl extends AbstractService implements KMCountryAreaService {
public List<KMCountry> getCountryListByName(String folderName){
List<KMCountry> list = getHibernateTemplate().findByNamedQuery("kmCountryListByName");
return list;
}
}
您没有将
folderName
传递到查询中。请尝试此操作
List<KMCountry> list = getHibernateTemplate().findByNamedQueryAndNamedParam("kmCountryListByName", "nomeFolder", folderName);
List List=getHibernateTemplate().findByNamedQueryAndNamedParam(“kmCountryListByName”、“nomeFolder”、“folderName”);
您没有将folderName
传递到查询中。请尝试此操作
List<KMCountry> list = getHibernateTemplate().findByNamedQueryAndNamedParam("kmCountryListByName", "nomeFolder", folderName);
List List=getHibernateTemplate().findByNamedQueryAndNamedParam(“kmCountryListByName”、“nomeFolder”、“folderName”);
您没有将folderName
传递到查询中。请尝试此操作
List<KMCountry> list = getHibernateTemplate().findByNamedQueryAndNamedParam("kmCountryListByName", "nomeFolder", folderName);
List List=getHibernateTemplate().findByNamedQueryAndNamedParam(“kmCountryListByName”、“nomeFolder”、“folderName”);
您没有将folderName
传递到查询中。请尝试此操作
List<KMCountry> list = getHibernateTemplate().findByNamedQueryAndNamedParam("kmCountryListByName", "nomeFolder", folderName);
List List=getHibernateTemplate().findByNamedQueryAndNamedParam(“kmCountryListByName”、“nomeFolder”、“folderName”);
你能发布异常吗?你能逐行调试代码,看看它在哪一行中断吗?然后,用try-catch
阻塞该行,并用e.printStackTrace()在catch
中打印堆栈跟踪
我想我知道问题出在哪里了,更新了答案。不看代码就无法判断,但可能的原因是它适用于非命名查询,或者可能使用位置参数(?1
)而不是命名参数(:param
)。我指的是您提到的其他查询,它们在没有findByNamedQueryAndNamedParam
的情况下工作。您能发布异常吗?您能逐行调试代码,并查看它在哪一行中断吗?然后,用try-catch
块环绕该行,并用e.printStackTrace()在catch
中打印堆栈跟踪
我想我知道问题出在哪里了,更新了答案。不看代码就无法判断,但可能的原因是它适用于非命名查询,或者可能使用位置参数(?1
)而不是命名参数(:param
)。我指的是您提到的其他查询,它们在没有findByNamedQueryAndNamedParam
的情况下工作。您能发布异常吗?您能逐行调试代码,并查看它在哪一行中断吗?然后,用try-catch
块环绕该行,并用e.printStackTrace()在catch
中打印堆栈跟踪
我想我知道问题出在哪里了,更新了答案。不看代码就无法判断,但可能的原因是它适用于非命名查询,或者可能使用位置参数(?1
)而不是命名参数(:param
)。我指的是您提到的其他查询,它们在没有findByNamedQueryAndNamedParam
的情况下工作。您能发布异常吗?您能逐行调试代码,并查看它在哪一行中断吗?然后,用try-catch
块环绕该行,并用e.printStackTrace()在catch
中打印堆栈跟踪
我想我知道问题出在哪里了,更新了答案。不看代码就无法判断,但可能的原因是它适用于非命名查询,或者可能使用位置参数(?1
)而不是命名参数(:param
)。我指的是您提到的其他查询,它们在没有findByNamedQueryAndNamedParam
的情况下工作。