【问题标题】:JPQL like expression requires int valueJPQL like 表达式需要 int 值
【发布时间】:2019-03-31 01:35:17
【问题描述】:

我想使用实体管理器 createquery 函数在我的数据库中搜索请求的值。每当我执行我的方法时,都会收到以下错误消息:

llegalArgumentException:您尝试为参数 searchvalue 设置类型为 java.lang.String 的值,查询字符串中的预期类型为 int

上面说需要一个int值,但我认为每个like表达式都需要一个字符串值?

实体:

public class Contract implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Basic(optional = false)
    @NotNull
    @Column(name = "number")
    private int number;

    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "type")
    private String type;

    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "description")
    private String description;

    @Basic(optional = false)
    @NotNull
    @Column(name = "start_date")
    @Temporal(TemporalType.DATE)
    private Date startDate;

    @Basic(optional = false)
    @NotNull
    @Column(name = "minimum_term")
    private int minimumTerm;

    @NotNull
    @Column(name = "cancellation_period")
    private int cancelTime;

    @Basic(optional = false)
    @NotNull
    @Column(name = "status")
    private int status;

    @JoinColumn(name = "user_id", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private Users userId;

    @JoinColumn(name = "supplier_id", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private Supplier supplierId;

    [...]
}

查询字符串:

List mylist = em.createQuery("SELECT c FROM Contract c WHERE c.userId = :userid AND (c.number LIKE :search OR c.type LIKE :search OR c.description LIKE :search OR c.startDate LIKE :search OR c.supplierId.name LIKE :search OR c.cancelTime LIKE :search OR c.minimumTerm LIKE :search)", Contract.class)
    .setParameter("userid", user).setParameter("search", "%"+search+"%")
    .getResultList()

提前致谢! :)

【问题讨论】:

    标签: java expression jpql sql-like


    【解决方案1】:

    正如@Andrei Nicusan 所说,您不能在 int 上使用 LIKE 运算符。

    您可以将值转换为字符串并在 where 子句中使用:

    1. 使用原生查询并使用MySQL cast function

    2. 使用您的 JPA 提供程序进行扩展功能,如果您使用 Hibernate,您也可以使用 CAST(类型为字符串)。见here

    【讨论】:

      【解决方案2】:

      首先,对于您的number 列,期望整数作为参数是很正常的,因为这是一个整数类型的列。您不能将数值与字符串进行比较或匹配。

      其次,LIKE 子句只能应用于字符串。见here

      【讨论】:

      • 还有其他方法吗?例如,在 MySQL 中,即使列是整数,我也可以使用 like 表达式搜索字符串。
      【解决方案3】:

      要在 JPQL 中从 int 转换为 string,您可以使用 CAST

      这里是一个例子(注意:假设 MyEntity 的 id 类型为 int)

      public List<MyEntity> getMyEntities(String idStr) {
         return entityManager.createQuery("SELECT m FROM MyEntity m WHERE CAST( m.id AS string ) LIKE :idStr")
               .setParameter("idStr", "%" + idStr+ "%").getResultList();
      }
      

      我正在将 JPA 2.1 与 Hibernate 提供程序一起使用。

      我对其进行了测试,之前的代码对我来说运行良好,所以我希望它可以帮助一些人:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-06
        • 1970-01-01
        相关资源
        最近更新 更多