Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Spring Hibernate4、JPA2和HSQL,无法按ID查询_Spring_Hibernate_Jpa 2.0_Hsqldb - Fatal编程技术网

Spring Hibernate4、JPA2和HSQL,无法按ID查询

Spring Hibernate4、JPA2和HSQL,无法按ID查询,spring,hibernate,jpa-2.0,hsqldb,Spring,Hibernate,Jpa 2.0,Hsqldb,我有一个名为服务的域对象,其中包含一个id字段: @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) @Column(name = "id", nullable = false) private Integer id; @Column(name = "type") private Service.ServiceTypes serviceType; 在我的DAO实现中,我可以轻松地按服务类型查询: @Override publ

我有一个名为服务的域对象,其中包含一个id字段:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id", nullable = false)
private Integer id;

@Column(name = "type")
private Service.ServiceTypes serviceType;
在我的DAO实现中,我可以轻松地按服务类型查询:

@Override
    public Set<Service> queryDatabaseByServiceType(ServiceTypes serviceType) {
        logger.debug("Querying the database by service type " + serviceType.toString());
        return new HashSet<Service>(super.entityManager.createQuery("from Service s where s.type = :serviceType").setParameter("serviceType", serviceType).getResultList());
    }
对于所有这些不同类型的查询,以下是日志输出:

DEBUG: service.impl.ServiceServiceImpl - Querying the database by service id 2
Hibernate: select service0_.service_id as service1_0_, service0_.description as descript2_0_, service0_.name as name0_, service0_.type as type0_, service0_.tmodel as tmodel0_, service0_.uddi_id as uddi6_0_, service0_.url as url0_, service0_.version as version0_ from services service0_ where service0_.service_id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - 1
INFO : service.impl.ServiceServiceImpl - results list from id query: 0
Hibernate: select service0_.service_id as service1_0_0_, service0_.description as descript2_0_0_, service0_.name as name0_0_, service0_.type as type0_0_, service0_.tmodel as tmodel0_0_, service0_.uddi_id as uddi6_0_0_, service0_.url as url0_0_, service0_.version as version0_0_ from services service0_ where service0_.service_id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - 1
Hibernate: select service0_.service_id as col_0_0_ from services service0_
INFO : service.impl.ServiceServiceImpl - z1 count: 0
Hibernate: select service0_.service_id as service1_0_, service0_.description as descript2_0_, service0_.name as name0_, service0_.type as type0_, service0_.tmodel as tmodel0_, service0_.uddi_id as uddi6_0_, service0_.url as url0_, service0_.version as version0_ from services service0_ where service0_.service_id=1
INFO : service.impl.ServiceServiceImpl - results1 from id query: 0
Hibernate: select service0_.service_id as service1_0_, service0_.description as descript2_0_, service0_.name as name0_, service0_.type as type0_, service0_.tmodel as tmodel0_, service0_.uddi_id as uddi6_0_, service0_.url as url0_, service0_.version as version0_ from services service0_ where service0_.service_id=2
INFO : service.impl.ServiceServiceImpl - results2 from id query: 0
Hibernate: select service0_.service_id as service1_0_0_, service0_.description as descript2_0_0_, service0_.name as name0_0_, service0_.type as type0_0_, service0_.tmodel as tmodel0_0_, service0_.uddi_id as uddi6_0_0_, service0_.url as url0_0_, service0_.version as version0_0_ from services service0_ where service0_.service_id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - 2

我们在项目中使用JPA2,但它没有这种问题,如何更改“公共服务queryDatabaseByServiceId(intID){”在我看来,在hibernate中,将id类型改为整数将是一个更好的选择。让我知道会发生什么。另一件事是更改log4j以打印sql以及检查它的参数值

<logger name="org.hibernate.type">
    <level value="trace"></level>
</logger>
<logger name="org.hibernate.sql">
    <level value="trace"></level>
</logger>


不知道,但是为什么不直接使用
Service s=em.find(Service.class,id)
?我确实尝试过——也没有结果……好像它存储的ID与预期的不同。我已经尝试过使用Integer,但仍然没有结果。我将ID的表名更改为service_ID,只是为了看看是否有一些奇怪的注释。下面是hibernate:hibernate:create table services的创建行(服务id整数不为空,描述变量字符(255),名称变量字符(255),类型整数,tmodel变量字符(255),uddi id变量字符(255),url变量字符(255),版本变量字符(255),主键(服务id))我可以将数据库写入一个文件而不是内存中,以便直接查看表/列/值吗?不可以。实际上,它只是关于log4j,您添加了我粘贴的代码,然后就可以看到参数值。当我运行查询时,我可以在日志中看到:TRACE:org.hibernate.type.descriptor.sql.BasicBinder-binding参数[1]为[INTEGER]-2,但是它仍然返回零结果。当我按服务类型查询时,它返回结果:{“services”:[{“id”:2,“serviceType”:“x”……好吧,结果是我犯了一个大错误——我将结果存储在内存和数据库中的映射中。我认为正在工作的查询实际上是使用映射,而不是查询数据库。结果是,所有查询都返回0项,包括“findAll()”。我在这里提出了一个新问题
Service ser = super.entityManager.find(Service.class, new Integer(1));

List z1 = super.entityManager.createQuery("select s.id from Service s").getResultList();

List results1 = super.entityManager.createQuery("SELECT s FROM Service s WHERE id = 1").getResultList();

List<Service> results = super.entityManager.createQuery("from Service as s where s.id = :id").setParameter("id", new Integer(1)).getResultList();
return new HashSet<Service>(super.entityManager.createQuery("from Service s where s.type = :serviceType").setParameter("serviceType", serviceType).getResultList());
{"services":[{"id":2,"serviceType":"x",.....
DEBUG: service.impl.ServiceServiceImpl - Querying the database by service id 2
Hibernate: select service0_.service_id as service1_0_, service0_.description as descript2_0_, service0_.name as name0_, service0_.type as type0_, service0_.tmodel as tmodel0_, service0_.uddi_id as uddi6_0_, service0_.url as url0_, service0_.version as version0_ from services service0_ where service0_.service_id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - 1
INFO : service.impl.ServiceServiceImpl - results list from id query: 0
Hibernate: select service0_.service_id as service1_0_0_, service0_.description as descript2_0_0_, service0_.name as name0_0_, service0_.type as type0_0_, service0_.tmodel as tmodel0_0_, service0_.uddi_id as uddi6_0_0_, service0_.url as url0_0_, service0_.version as version0_0_ from services service0_ where service0_.service_id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - 1
Hibernate: select service0_.service_id as col_0_0_ from services service0_
INFO : service.impl.ServiceServiceImpl - z1 count: 0
Hibernate: select service0_.service_id as service1_0_, service0_.description as descript2_0_, service0_.name as name0_, service0_.type as type0_, service0_.tmodel as tmodel0_, service0_.uddi_id as uddi6_0_, service0_.url as url0_, service0_.version as version0_ from services service0_ where service0_.service_id=1
INFO : service.impl.ServiceServiceImpl - results1 from id query: 0
Hibernate: select service0_.service_id as service1_0_, service0_.description as descript2_0_, service0_.name as name0_, service0_.type as type0_, service0_.tmodel as tmodel0_, service0_.uddi_id as uddi6_0_, service0_.url as url0_, service0_.version as version0_ from services service0_ where service0_.service_id=2
INFO : service.impl.ServiceServiceImpl - results2 from id query: 0
Hibernate: select service0_.service_id as service1_0_0_, service0_.description as descript2_0_0_, service0_.name as name0_0_, service0_.type as type0_0_, service0_.tmodel as tmodel0_0_, service0_.uddi_id as uddi6_0_0_, service0_.url as url0_0_, service0_.version as version0_0_ from services service0_ where service0_.service_id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - 2
<logger name="org.hibernate.type">
    <level value="trace"></level>
</logger>
<logger name="org.hibernate.sql">
    <level value="trace"></level>
</logger>