在Spring data jpa中原生查询参数需要使用双引号括起来。

4
我必须使用Spring Data JPA本地查询来运行以下Oracle查询。
create user "kshitij" identified by "qwert123"

我正在尝试这个:

@Query(value="create user \"?1\" identified by \"qwert123\"",nativeQuery=true)
    void createUser(String userName);

然而,当我使用""来包装?1时,Hibernate将不再将?1视为要由userName替换的变量,而是视为实际字符串。如何在Spring Data JPA中运行上述Oracle查询?

除了创建之外,我还想检查用户是否存在。

当前不起作用的方法:

@Query(value="select username from all_users where username = \"?1\"", nativeQuery=true)

请使用@Rohan Shah的答案或删除?1周围的双引号。将您的查询替换为@Query(value="create user ?1 identified by \"qwert123\"",nativeQuery=true) @Modifying void createUser(String userName); - Naanavanalla
为什么你想要双引号 "" ...... 这可以是 CREATE USER myuser IDENTIFIED BY password。 - DEBENDRA DHINDA
请检查以下链接,了解如何在 JPA 中使用正确的位置参数:https://stackoverflow.com/questions/56310935/queryexception-jpa-style-positional-param-was-not-an-integral-ordinal/56315857#56315857 - DEBENDRA DHINDA
4个回答

1

您是否尝试使用参数?有一个注释可以告诉本地查询哪些是参数,它的格式如下:

@Query(value="create user :userName identified by \"qwert123\"",nativeQuery=true)
    void createUser(@Param("userName")String userName);

使用这种方法会产生与?1相同的问题,因为在将:userName包装在引号中后,即":userName",它再次变成了字符串文字。我想要实现的是在变量被替换的同时,用引号包装它们。 - Kshitij Kohli
但他想在查询中使用引号 @SternK - dxjuv
如果我没有在参数中加引号,我会遇到以下问题: https://stackoverflow.com/questions/59409574/parameterized-queries-to-create-a-user-throwing-missing-user-or-role-name-except - Kshitij Kohli

0

这很容易,但我也需要一些时间来弄清楚!

当您使用Postgres时,提供了一个函数来实现双引号(也有一个用于单引号)。JPA-Native-Query将在参数值上执行它!

quote_ident(:param)

这适用于命名查询参数。尚未尝试过未命名的,但这并没有太大的区别!


0

你能试试这段代码吗?

@Modifying
@Transactional
@Query(value="create user :userName identified by \"qwert123\"",nativeQuery=true)
void createUser(@Param("userName") String userName);

-1
将此代码放置在类或实体的顶部。
@NamedQueries({
    @NamedQuery(name = "EntityName.getUserName", query = "SELECT u FROM User u WHERE u.username = :username")
}) 

命名查询


如何解决这个问题?查询仍然可以在没有双引号的情况下运行。根据我的观察,当Spring Data JPA替换参数并动态生成查询时,它会将参数用单引号括起来。这对于select * where查询可能有效,但对于创建用户/删除用户查询来说,这是一个无效的Oracle查询,直接在Oracle上运行也会失败,这就是为什么我重要的原因是将它们用双引号括起来。 - Kshitij Kohli
你设置了一个参数值为username吗? - Atul Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接