【问题标题】:JPA EclipseLink 'Characters' in IN clauseIN 子句中的 JPA EclipseLink 'Characters'
【发布时间】:2013-09-06 12:31:24
【问题描述】:

如何在 JPQL 的 JPA 的 IN 子句中使用字符? 例如在 oracle DB 中我有这个查询:

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

Channel 模式是 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] 的预期参数

【问题讨论】:

  • 您能否展示您正在使用的实际 JPQL 查询、您用于执行它的代码,以及您查询的实体?
  • 亲爱的克里斯,我已经编辑了我的问题,并在其中包含了 JPQL 查询和实体。

标签: oracle eclipselink jpql


【解决方案1】:

您是否尝试过使用字符串而不是字符,即“O”、“R”。

【讨论】:

  • 我确实尝试过使用字符串而不是字符,但得到了同样的错误:IN 表达式参数无效 [O],预期参数类型为 [java.lang.Character]
【解决方案2】:

JPA 规范规定 字符串文字 用单引号括起来(例如,'X' 是长度为 1 的字符串,而不是字符 X)。

在您的情况下,JPQL 需要一个字符列表,而不是字符串。您可以通过将字符列表作为参数传递来解决此问题:

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

旁注:使用枚举代替字符可以让你的生活更轻松。然后,您可以直接在查询中引用枚举值而不会出现问题。在数据库级别,枚举仍然可以映射到单个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多