使用 JPQL 的查询不能作为 nativeQuery

Query utilizing JPQL does not work as nativeQuery

我有以下 sql 查询,它按预期工作

Query query = entityManager.createNativeQuery("" +
                "SELECT d.id FROM document d \n" +
                "INNER JOIN users_documents ud \n" +
                "ON ud.document_id = d.id\n" +
                "WHERE ( d.document_state_id=2 OR d.document_state_id=3 OR d.document_state_id=1)\n" +
                "AND d.title LIKE \"%abc%\" AND ud.user_id=4 AND ud.sharing_type_id=1\n" +
                "OR (d.document_state_id=1 AND d.title LIKE \"%abc%\" AND ud.user_id=4 AND ud.sharing_type_id=2);");

我有这个 JPQL,但它不起作用,它 returns 总是什么都没有。

   TypedQuery<Long> q1 = entityManager.createQuery("Select d.id FROM Document d " +
                    "INNER JOIN d.documentsForUsers ud" +
                    " WHERE ((d.documentState.id=2 OR d.documentState.id=3 OR d.documentState.id=1)" +
                    " AND (d.title LIKE :value2 AND ud.user.id=:id AND ud.sharingType.id=2))" +
                    " OR (d.documentState.id=1 AND d.title LIKE :value3 AND ud.user.id=:id2 AND ud.sharingType.id=2)"
            , Long.class);



    q1.setParameter("value2", "%"+name+"%");
    q1.setParameter("id", userId);
    q1.setParameter("value3", "%"+name+"%");
    q1.setParameter("id2", userId);

如何将 nativeSQL 查询重写为 JPQL 以使其正常工作?

这个答案主要纠正了一些括号拼写错误,但请注意您在 JPQL 查询中的 WHERE 子句与本机查询中的子句不同。对 JPQL 查询应用相同的括号平衡得到:

String sql = "SELECT d.id FROM Document d INNER JOIN d.documentsForUsers ud " +
    "WHERE d.document_state_id IN (1,2,3) AND " +
    "d.title LIKE :value2 AND ud.user_id = :id AND ud.sharing_type_id = 1 OR " +
    "(d.document_state_id = 1 AND d.title LIKE :value3 AND ud.user_id = :id2 AND ud.sharing_type_id = 2)";

我不确切知道您在 WHERE 子句中尝试使用什么逻辑,但以上内容至少与本机查询中使用的内容保持一致。

怀疑您可能打算使用此版本:

String sql = "SELECT d.id FROM Document d INNER JOIN d.documentsForUsers ud " +
    "WHERE (d.document_state_id IN (1,2,3) AND " +
    "d.title LIKE :value2 AND ud.user_id = :id AND ud.sharing_type_id = 1) OR " +
    "(d.document_state_id = 1 AND d.title LIKE :value3 AND ud.user_id = :id2 AND ud.sharing_type_id = 2)";