SQL语言的布局和IllegalArgumentException

本文解决了一个关于JPA风格的位置参数不是整数序号的问题。在使用JPA+Struts+Hibernate进行开发时,作者尝试将HQL语句拆分为多行以提高可读性,但遇到了org.hibernate.QueryException异常。通过调整HQL语句中的空格,最终解决了这一问题。
和java.lang.IllegalArgumentException: org.hibernate.QueryException: JPA-style positional param was not an integral ordinal战斗了半天,汗啊!
使用jpa + strut+ hibernate 就报org.hibernate.QueryException: JPA-style positional param was not an integral ordinal

一般把hql语句写在一行,会很长,在ide中需要拖动滚动条才能查看。为了方便阅读,故改成几行:
public List<Resource> getResourceByTag(Tag tag,int start) {
        Query query = entityManager.createQuery(
                "SELECT r FROM Resource r WHERE ?1" +
                "IN (SELECT t FROM r.res_tags t)" +
                "ORDER BY r.res_update_date DESC");
        query.setParameter(1, tag);
        query.setFirstResult(start);
        query.setMaxResults(Constants.ITEMS_PER_PAGE);
        return query.getResultList();
    }

然后就报错ava.lang.IllegalArgumentException: org.hibernate.QueryException: JPA-style positional param was not an integral ordinal。
啊啊啊啊啊啊,sql中少了好几个空格,就在换行的地方

正确:
"FROM Resource r WHERE ?1 " +
                "IN (FROM r.res_tags) " +
                "ORDER BY r.res_update_date DESC");
无奈的教训!
### `IllegalArgumentException` `RemoteException` 的原因与解决方法 在 Android 开发中,`IllegalArgumentException` `RemoteException` 是常见的异常类型,分别代表本地参数错误跨进程通信失败。了解它们的成因及应对策略对于构建稳定的应用至关重要。 #### `IllegalArgumentException` 该异常通常表示调用方法时传入了不合法或不合理的参数。在系统框架层,若传入的参数不符合预期(如空值、无效 URI 等),就会抛出此异常。 例如,在 `ContentResolver` 的 `query()` 方法中,如果无法通过给定的 `Uri` 获取到对应的 `ContentProvider`,则会抛出 `IllegalArgumentException("Unknown URI " + uri)`[^2]。 ```java public final Cursor query(final Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal) { IContentProvider provider = acquireProvider(uri); if (provider == null) { throw new IllegalArgumentException("Unknown URI " + uri); // 参数异常 } try { return provider.query(mPackageName, uri, projection, selection, selectionArgs, sortOrder, cancellationSignal); } catch (RemoteException e) { throw new RuntimeException("Failed to query: " + uri, e); } finally { releaseProvider(provider); } } ``` **常见原因:** - 未注册具有指定 `authority` 的 `ContentProvider`,导致系统无法解析传入的 `Uri` [^3]。 - 使用了格式错误或拼写错误的 `Uri`。 - 调用了某个 API 但传入了非法的参数值(如负数索引、空对象等)。 **解决方案:** - 在 `AndroidManifest.xml` 中正确声明 `ContentProvider` 并确保其 `android:authorities` 属性与使用时一致。 - 检查并验证所有传入的参数,尤其是涉及外部输入的数据。 - 使用断言或前置条件检查工具类(如 `Objects.requireNonNull()` 或 `Preconditions.checkArgument()`)来提前捕获非法参数。 --- #### `RemoteException` `RemoteException` 表示远程进程调用失败,通常发生在 IPC(Inter-Process Communication)过程中,比如通过 AIDL 接口与系统服务或其他应用组件通信时发生异常。 例如,在 `ContentResolver` 的 `query()` 方法中,如果远程 `ContentProvider` 抛出了异常,则会触发 `RemoteException`,进而被封装为 `RuntimeException` 抛出。 ```java try { return provider.query(...); } catch (RemoteException e) { throw new RuntimeException("Failed to query: " + uri, e); } ``` **常见原因:** - 远程服务端崩溃或未启动。 - 跨进程通信时数据序列化/反序列化失败。 - 权限不足导致服务拒绝响应。 - Android 版本升级后接口变更,客户端与服务端不兼容。 **解决方案:** - 在调用远程接口前添加异常捕获逻辑,避免直接抛出 `RemoteException`。 - 使用 `Binder.isProxy()` 判断是否为远程调用,从而决定是否需要额外处理。 - 对于关键操作,设计重试机制或降级策略,提高容错能力。 - 若为系统服务调用失败,可尝试重启服务或检查权限配置。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值