简体   繁体   English

使用 JPQL 的查询不能作为 nativeQuery

[英]Query utilizing JPQL does not work as nativeQuery

I have the following sql query which works as expected我有以下按预期工作的 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);");

And I have this JPQL which DOES not work, it returns nothing always.我有这个不起作用的 JPQL,它总是不返回任何内容。

   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);

How can I rewrite that nativeSQL query to JPQL to make it work properly?如何将该 nativeSQL 查询重写为 JPQL 以使其正常工作?

This answer mainly corrects some parentheses typos, but appreciate that your WHERE clause in the JPQL query is not the same as in the native.该答案主要纠正了一些括号拼写错误,但请注意 JPQL 查询中的WHERE子句与本机中的不同。 Applying the same balancing of parentheses to the JPQL query gives:对 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)";

I don't know exactly what logic you are trying to use in the WHERE clause, but the above at least stays true to what is being used in the native query.我不确切知道您尝试在WHERE子句中使用什么逻辑,但上述内容至少对本机查询中使用的内容保持真实。

I suspect that you might be intending this version:怀疑你可能想要这个版本:

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)";

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM