Java 为什么这个Hibernate JPQL查询可以';不行?

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

我对HibernateJPQL查询非常陌生,在尝试启动以下查询时遇到了一些问题。情况如下,我有:

1) 一个名为KMCountryArea的实体类,用于映射我的数据库上的KMCountryArea表:

@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;
    
实际上,这个Hibernate实体类在我的数据库中正确地生成了KM\u COUNTRY表,这是我在数据库中看到的KM\u 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
的情况下工作。