0

とりわけ id フィールドを含む Service というドメイン オブジェクトがあります。

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

@Column(name = "type")
private Service.ServiceTypes serviceType;

私の DAO 実装では、serviceType で簡単にクエリできます。

@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());
    }

そのメソッドをコピーして貼り付け、「id」に対してクエリを実行しようとすると、結果がゼロになります。

@Override
    public Service queryDatabaseByServiceId(int id) {
List<Service> results = super.entityManager.createQuery("from Service s where s.id = :id").setParameter("id", id).getResultList();
return results.get(0);

常に何も返しません....私は何百万もの方法で試しました...

CriteriaBuilder builder = super.entityManager.getCriteriaBuilder();
CriteriaQuery<Service> criteria = builder.createQuery(Service.class);
Root<Service> s1 = criteria.from(Service.class);
TypedQuery<Service> query = super.entityManager.createQuery(
    criteria.select(s1).where(builder.equal(s1.get("id"), id)));
Service service = query.getSingleResult();
return service;

まだ何もありません。IDではなく他の列に対してクエリを実行できる理由がわかりません。渡した ID が有効であることを確認しましたが、何も機能しません。

何か案は?

編集:クエリを試した他の方法は次のとおりです。

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();

ドメインオブジェクトのフィールドを「id」ではなく「idx」に変更しようとしました。列名を「service_id」に変更しようとしましたが、id フィールドとオブジェクトに使用するものとの間に内部競合がある可能性があると考えています。 、しかしまだ何もありません。前とコメントで述べたように、他のフィールドによるクエリは正常に機能し、ID を示す結果を簡単に取得できます。

return new HashSet<Service>(super.entityManager.createQuery("from Service s where s.type = :serviceType").setParameter("serviceType", serviceType).getResultList());

データが入力されたリストを生成し、json に変換すると、ブラウザに次のように表示されます。

{"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
4

1 に答える 1

1

プロジェクトではJPA2を使用していますが、この種の問題はありません。「public Service queryDatabaseByServiceId(int id){」id型を整数に変更するのはどうでしょうか。私の意見では、休止状態の整数の方が適しています。何が起こるか教えてください。もう1つは、log4jを変更してSQLを出力し、パラメーター値を変更してチェックすることです。

<logger name="org.hibernate.type">
    <level value="trace"></level>
</logger>
<logger name="org.hibernate.sql">
    <level value="trace"></level>
</logger>
于 2012-10-27T07:13:17.307 に答える