7

JPAでいくつかのデータをクエリしようとしています。これが私のクエリです。

@Override
    public List<HorarioAtencion> findByPeriodo(Person person, int dia, int mes, int anno) {
        Query busqueda = em.createNativeQuery("Select * from HorariosAtencion where " +
                                              "idPerson = ?1 AND "+
                                              "DAY( fechaInicio) <= ?2 AND MONTH( fechaInicio ) <= ?3 AND YEAR( fechaInicio) <= ?4 AND "+
                                              "DAY( fechaFin) >= ?2 AND MONTH( fechaFin ) >= ?3 AND YEAR( fechaFin ) >= ?4 ORDER BY TIME(fechaInicio)", HorarioAtencion.class);
       busqueda.setParameter(1,person.getId());
       busqueda.setParameter(2, dia);
       busqueda.setParameter(3, mes);
       busqueda.setParameter(4, anno);
       return busqueda.getResultList();
    }

このクエリは結果を返しますが、次の例外が発生します。

Caused by: Exception [EclipseLink-6044] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.QueryException
Exception Description: The primary key read from the row [ArrayRecord(
     => 1
     => 13
     => 2013-01-04 12:25:00.0
     => 2013-01-04 12:25:00.0
     => true
     => true
     => true
     => true
     => true
     => true
     => true)] during the execution of the query was detected to be null.  Primary keys must not contain null.
Query: ReadAllQuery(referenceClass=HorarioAtencion sql="Select * from HorariosAtencion where idPerson = ? AND DAY( fechaInicio) <= ? AND MONTH( fechaInicio ) <= ? AND YEAR( fechaInicio) <= ? AND DAY( fechaFin) >= ? AND MONTH( fechaFin ) >= ? AND YEAR( fechaFin ) >= ? ORDER BY TIME(fechaInicio)")

これはどのように発生し、どうすれば解決できますか?

エンティティクラスの列定義:

private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Basic(optional = false)
    @Column(name = "fechaInicio")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaInicio;

    @Basic(optional = false)
    @Column(name = "fechaFin")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaFin;

    @Basic(optional = false)
    @Column(name = "domingo")
    private boolean domingo;

    @Basic(optional = false)
    @Column(name = "lunes")
    private boolean lunes;

    @Basic(optional = false)
    @Column(name = "martes")
    private boolean martes;

    @Basic(optional = false)
    @Column(name = "miercoles")
    private boolean miercoles;

    @Basic(optional = false)
    @Column(name = "jueves")
    private boolean jueves;

    @Basic(optional = false)
    @Column(name = "viernes")
    private boolean viernes;

    @Basic(optional = false)
    @Column(name = "sabado")
    private boolean sabado;

    @JoinColumn(name = "idPersona", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private Persona idPersona;
4

7 に答える 7

14

どのデータベースを使用していて、列名に対して何を返しますか?

EclipseLinkeclipselink.jpa.uppercase-column-namesは、 persistentプロパティがtrueに設定されて いない限り、デフォルトで最近のバージョンでは大文字と小文字を区別します。

"ID"小文字として定義されているときにデータベースが列名を大文字として返す場合、これはネイティブクエリの問題になる可能性があります"id"

データベースが使用するものと一致するようにアノテーションの列定義を変更するか、trueの値でプロパティを追加してみてください。

于 2013-01-07T04:44:01.053 に答える
5

問題は、eclipselinkで大文字と小文字が区別されることです。これに対処するために利用できる「ヒント」があります。次の要素をpersistence.xmlファイルのプロパティ要素の間に配置します。

<!-- Hint to solve "The primary key read from the row [DatabaseRecord(...)] during the execution of the query was detected to be null." errors.-->
<property name="eclipselink.jpa.uppercase-column-names" value="true"/>

これにより、大文字と小文字を区別しない方法で列名が処理され、エラーが排除されます。

于 2013-11-18T18:09:54.887 に答える
2

このスレッドhttps://forums.oracle.com/thread/614380が見つかりました。

postgresとEclipseLinkでも同じ問題がありました。

解決策:主キー列を大文字に変更します。つまり、次のようになります。

idを"ID"、field1、field2、...、テーブルからfieldnとして選択します...。

于 2013-07-13T01:53:51.197 に答える
1

HorariosAtencionテーブルのどこかでnull、主キーに対応するフィールドに値が見つかりました。

于 2013-01-04T19:47:43.213 に答える
0

...行から読み取られた主キー[ArrayRecord(..。

HorariosAtencionレコードが正常であることを示します。2つのID、2つの日付、およびすべてのブール値があります。1おそらくID値です。したがって、例外は関連する Personaエンティティを参照していると思います。PersonaPKがヌルのはありますか?

于 2013-01-04T20:04:25.237 に答える
0

HorariosAtencion/Personaの1つ以上の主キーにnull値がある/存在しないかのいずれかです。データベースを再確認してください。

または、オブジェクトを参照する代わりにペルソナIDを設定する必要があります。

public List<HorarioAtencion> findByPeriodo(Person person, int dia, int mes, int anno) {
    Query busqueda = em.createQuery("from HorariosAtencion where " +
                                          "idPerson = ?1 AND "+
                                          "DAY( fechaInicio) <= ?2 AND MONTH( fechaInicio ) <= ?3 AND YEAR( fechaInicio) <= ?4 AND "+
                                          "DAY( fechaFin) >= ?2 AND MONTH( fechaFin ) >= ?3 AND YEAR( fechaFin ) >= ?4 ORDER BY TIME(fechaInicio)", HorarioAtencion.class);
   busqueda.setParameter(1,person);
   busqueda.setParameter(2, dia);
   busqueda.setParameter(3, mes);
   busqueda.setParameter(4, anno);
   return busqueda.getResultList();
}

また

public List<HorarioAtencion> findByPeriodo(Person person, int dia, int mes, int anno) {
    Query busqueda = em.createNativeQuery("Select * from HorariosAtencion where " +
                                          "**idPerson.id** = ?1 AND "+
                                          "DAY( fechaInicio) <= ?2 AND MONTH( fechaInicio ) <= ?3 AND YEAR( fechaInicio) <= ?4 AND "+
                                          "DAY( fechaFin) >= ?2 AND MONTH( fechaFin ) >= ?3 AND YEAR( fechaFin ) >= ?4 ORDER BY TIME(fechaInicio)", HorarioAtencion.class);
   busqueda.setParameter(1,person.getId());
   busqueda.setParameter(2, dia);
   busqueda.setParameter(3, mes);
   busqueda.setParameter(4, anno);
   return busqueda.getResultList();
}
于 2013-02-17T19:23:02.817 に答える
0

同じ問題が発生し、解決策を見つけました。em.createNativeQueryの行から「HorarioAtencion.class」を削除してみてください。

于 2014-07-23T16:25:51.237 に答える