2015-05-12 96 views
0

我在這很好地工作的情況下,像這樣的應用程序的用戶信息庫:結合參數和硬編碼的條款在春天JPA @Query

@Query(" FROM UserEntity ue WHERE ue.site.id = :site_id 
     and ue.name = :username") 
User findByUsername(@Param("site_id") String siteId, 
        @Param("username") String userName); 

現在有在用戶領域的一個新的選擇,這應該防止用戶出現在應用程序的任何地方。因此,而不是修正整個應用程序,我已經決定修改只是在倉庫與硬編碼子句這樣的疑問:

@Query(" FROM UserEntity ue WHERE ue.site.id = :site_id 
     and ue.name = :username and ue.state != 'Disabled'") 
User findByUsername(@Param("site_id") String siteId, 
        @Param("username") String userName); 

(變更部分and ue.state != 'Disabled'

的問題是,這樣的查詢無論國家的價值是什麼,都不會返回任何東西。

我也試過ue.state not like 'Disabled',但結果相同。 我見過很多使用@Query的例子,但沒有找到任何硬編碼的子句。這甚至有可能嗎?

+0

你嘗試'不in'以及可以讓SQL真實,檢查哪些查詢其發電。 –

+0

是的。我試過'不在('禁用')'。相同的結果 – NeplatnyUdaj

+0

首先在hibernate配置文件中創建數據庫,並將您的查詢作爲控制檯日誌來測試它將打印查詢。只需檢查其填充內容。您可以在sqlbrowser中檢查相同的查詢。 –

回答

2

是的,你可以在不改變方法簽名的情況下傳遞硬編碼值。

JPA庫

@Query(" FROM Users ue WHERE ue.userLogin = :userLogin and ue.userName != 'admin'") 
public Users cehckeme(@Param("userLogin") String userLogin); 

測試代碼

ApplicationContext ctx = new ClassPathXmlApplicationContext(
        "spring_model.xml"); 
usersRepository = (UsersRepository) ctx.getBean("usersRepository"); 
      System.out.println(usersRepository.cehckeme("pthakre").getUserLogin()); 

Genrated查詢

Hibernate: 
select 
    * 
from 
    (select 
     users0_.USER_ID as USER1_2_, 
     users0_.USER_LOGIN as USER2_2_, 
     users0_.USER_NAME as USER3_2_, 
     users0_.USER_PASSWORD as USER4_2_ 
    from 
     MED_USERS users0_ 
    where 
     users0_.USER_LOGIN=? 
     and users0_.USER_NAME<>'admin') 
where 
    rownum <= ? 
+0

我修改了它不是。 –