2

JPQLのJPAのIN句で文字を使用するにはどうすればよいですか? たとえば、Oracle DBには次のクエリがあります。

select * from channel o where channel_mode IN ('O','R')

チャネル モードは、DB の char 列です。

JPQL からinvalid IN argument[o]、文字であるというエラーが表示されます。

@クリスこれはJPQLです:

typeMasterList = em.createQuery("select object(o) from ChannelRequest as o where     o.crqState IN ('O','R') and o.crqMode = 'B' ").getResultList();

エンティティ ChannelRequest は次のとおりです。

@Entity
@Table(name = "CHANNEL_REQUEST")
@XmlRootElement

public class ChannelRequest implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "CRQ_ID")
private Long crqId;
@Size(max = 100)
@Column(name = "CRQ_QUEUE")
private String crqQueue;
@Size(max = 160)
@Column(name = "CRQ_DATA")
private String crqData;
@Column(name = "CRQ_STATE")
private Character crqState;
@Column(name = "ACTIVE_FLAG")
private Short activeFlag;
@Column(name = "ENABLED")
private Short enabled;
@Size(max = 100)
@Column(name = "CRQ_ADDRESS")
private String crqAddress;
@Column(name = "CRQ_MODE")
private Character crqMode;
@Column(name = "DCO")
@Temporal(TemporalType.TIMESTAMP)
private Date dco;
@Column(name = "DLUO")
@Temporal(TemporalType.TIMESTAMP)
private Date dluo;
@OneToMany(mappedBy = "rpmrqCrId")
private Collection<RpmRequest> rpmRequestCollection;
@JoinColumn(name = "MM_ID", referencedColumnName = "MM_ID")
@ManyToOne
private MediumMaster mmId;
@JoinColumn(name = "MC_ID", referencedColumnName = "MC_ID")
@ManyToOne
private MediumChannel mcId;`enter code here`

これは私が得るエラーです:無効なIN式引数[O]、タイプ[java.lang.Character]の予想される引数

4

2 に答える 2

1

JPA 仕様では、文字列リテラルは一重引用符で囲むと規定されています (たとえば'X'、文字ではなく長さ 1 の文字列ですX)。

あなたの場合、JPQLは文字列ではなく文字のリストを期待しているようです。代わりに文字リストをパラメーターとして渡すことで、この問題を回避できます。

typeMasterList = em.createQuery("... o.crqState IN :states ...")
                   .setParameter("states", Arrays.asList('O', 'R'))
                   .getResultList();

補足: 文字の代わりに列挙型を使用すると、作業がずっと簡単になります。その後、問題なくクエリで列挙値を直接参照できます。データベース レベルでは、列挙型は引き続き 1 文字にマップできます。

于 2013-09-05T16:38:09.103 に答える
0

文字の代わりに文字列、つまり「O」、「R」を使用してみましたか。

于 2013-09-03T14:20:12.353 に答える