Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用JPQL的查询不能作为nativeQuery使用_Sql_Hibernate_Spring Boot_Jpa_Jpql - Fatal编程技术网

Sql 使用JPQL的查询不能作为nativeQuery使用

Sql 使用JPQL的查询不能作为nativeQuery使用,sql,hibernate,spring-boot,jpa,jpql,Sql,Hibernate,Spring Boot,Jpa,Jpql,我有下面的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.doc

我有下面的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,它总是不返回任何东西

   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);
TypedQuery q1=entityManager.createQuery(“从文档d中选择d.id”+
“内部连接d.documentsForUsers ud”+
“其中((d.documentState.id=2或d.documentState.id=3或d.documentState.id=1)”+
“和(d.title-LIKE:value2和ud.user.id=:id和ud.sharingType.id=2))”+
“或(d.documentState.id=1和d.title-LIKE:value3和ud.user.id=:id2和ud.sharingType.id=2)”
,长班);
q1.setParameter(“值2”,“百分比”+名称+“%”);
q1.设置参数(“id”,用户id);
q1.setParameter(“值3”,“百分比”+名称+“%”);
q1.设置参数(“id2”,用户ID);

如何将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)";

如果您从JPQL查询中完全删除
WHERE
子句,您会得到任何结果吗?@Tim Biegeleisen是的,可以。