0

簡単にできるはずだったことが、想像よりも少し複雑であることが判明したので、誰かが助けてくれることを願っています.

基本的に、SQL Server に次のような古典的な注文データベース テーブルがあります。

CREATE TABLE [dbo].[order] (
    [orderid] [bigint] NOT NULL,
    [uniqueid] [uniqueidentifier] NOT NULL,
    [revision] [int] NOT NULL,
    <lots of other stuff...>
  CONSTRAINT [PK_order] PRIMARY KEY ([orderid]),
  CONSTRAINT [UK_order] UNIQUE ([uniqueid], [revision])
)

SQL Management Studio から (uniqueid, Revision) で注文を検索するのは夢のようです。

SELECT *
  FROM [order]
 WHERE [uniqueid] = '9E2822E9-4D08-4A25-8A86-ADAF8DB511CE' AND [revision] = 5;

適切なものを返します。

JPA フレームワークから orders テーブルにアクセスしようとすると、問題が発生します。これは、注文テーブルのエンティティ マッピングです。

@Entity
@Table(name="[order]")
public class Order implements Serializable {
  @Id
    private long orderid;

  private String uniqueid;

  private int revision;

  <lots of other stuff...>
}

orderid による注文の検索は夢のように機能します。

public Order loadOrder(long orderid) {
    return JPA.getManager().find(Order.class, orderid);
}

適切なものを返します。

JPA フレームワークから (uniqueid、revision) で注文を取得しようとすると、問題が発生します。これは惨めに失敗します:

public Order loadOrder(String uniqueid, int version) {
    Query q = JPA.getManager().createQuery("SELECT o FROM Order o WHERE o.uniqueid=:uniqueid AND o.version=:version");
    q.setParameter("uniqueid", uniqueid).setParameter("version", version);
    ...
}

java.sql.SQLException: 文字列からuniqueidentifierへの変換時に変換に失敗しました。SQLException メッセージをグーグル検索すると、大量の結果が得られますが、すべて一意の識別子を生成する必要があります。私は何も生成していません - 既存の値を調べようとしているだけです。

明らかな何かが欠けているというしつこい感じがありますが、行き詰まっていることを認めなければなりません。何か助けはありますか?

ところで、JPA.getManager() は javax.persistence.EntityManager のインスタンスを返します。

4

1 に答える 1