2014-06-26 48 views
0

我想知道是否有可能使用域對象構建jpa查詢。使用域對象的JPA查詢Spring mvc jpa rest

例如:

 @Entity 
     public class User { 
     private String firstname; 
     private String lastname; 
     private String email; 
    } 

在實際的對象有更多的領域。我收到此對象的有效json字符串。但並不是所有的領域都被填補。

比如我只得到填補姓:

{"firstname":"Peter","lastname":"","email":""} 

這JSON被反序列化到用戶對象

現在我想使只使用與接收的參數對象的搜索。結果應該是Peter的所有用戶。

問題是可以只給查詢的對象?

感謝輸入


編輯1

感謝您的幫助,直到現在。我找到了使用實體搜索合同的解決方案。在這個解決方案中,我發佈了一些合同和其他方法的更新值。

的JSON現在這個樣子:

contract = {fromDate:moment($('#datepickerVon').val(), 'DD-MM-YYYY').format('DD-MM-YYYY'), endDate:moment($('#datepickerVon').val(), 'DD-MM-YYYY').format('DD-MM-YYYY'), Season: { 
      season: "SO14"}, name: {name: "peter"}, category:{category:"SomeString"}}; 

      console.log(contract); 
     $.ajax({ 
      url:'/contracts/search/', 
      dataType: "json", 
      type: "POST", 
      mimeType: 'application/json', 
      contentType: "application/json", 
      data: JSON.stringify(contract), 
      success: function(data) { 
       console.log(data); 
      } 
      }); 

控制器接收這樣的:

@RequestMapping(value = "/search/", method = RequestMethod.POST, headers = "Accept=application/json") 
public ResponseEntity<String> getVertagFromSearch(@RequestBody String json, UriComponentsBuilder uriBuilder){ 
    Contract contract = contract.fromJsonToContract(json); 
    List<Contract> contractList = Contract.findAllContractsPerContract(contract); 
    return new ResponseEntity<String>(Contract.toJsonArray(contractList), headers, HttpStatus.OK); 
} 

反序列化是在這裏:

public static contract fromJsonToContract(String json) { 
    return new JSONDeserializer<Contract>().use(Calendar.class, new CalendarTransformer("dd-MM-yyyy HH:mm")).use(null, Contract.class).deserialize(json); 
} 

而且這裏的交易方法。

@Transactional 
public static List<Contract> findAllContractsPerContract(Contract contract) { 
    EntityManager e = entityManager().getEntityManagerFactory().createEntityManager(); 
    Session session = e.unwrap(Session.class); 
    Example contractExample = Example.create(contract); 
    Criteria c = session.createCriteria(Contract.class).add(contractExample); 
    List<Contract> list = c.list(); 
    return list; 
} 

用這個例子我得到了結果。現在的問題是,是否有可能添加一些標準的SQL像「大或小」或「喜歡」。因爲目前看起來所有的標準都是用「等於」來搜索的。

謝謝

+0

查看Hibernate示例http://java.dzone.com/articles/hibernate-query-example-qbe。在JPA – geoand

回答

0

由於到現在爲止。我找到了使用實體搜索合同的解決方案。在這個解決方案中,我發佈了一些合同和其他方法的更新值。

的JSON現在這個樣子:

contract = {fromDate:moment($('#datepickerVon').val(), 'DD-MM-YYYY').format('DD-MM-YYYY'), endDate:moment($('#datepickerVon').val(), 'DD-MM-YYYY').format('DD-MM-YYYY'), Season: { 
      season: "SO14"}, name: {name: "peter"}, category:{category:"SomeString"}}; 

      console.log(contract); 
     $.ajax({ 
      url:'/contracts/search/', 
      dataType: "json", 
      type: "POST", 
      mimeType: 'application/json', 
      contentType: "application/json", 
      data: JSON.stringify(contract), 
      success: function(data) { 
       console.log(data); 
      } 
      }); 

控制器接收這樣的:

@RequestMapping(value = "/search/", method = RequestMethod.POST, headers = "Accept=application/json") 
public ResponseEntity<String> getVertagFromSearch(@RequestBody String json, UriComponentsBuilder uriBuilder){ 
    Contract contract = contract.fromJsonToContract(json); 
    List<Contract> contractList = Contract.findAllContractsPerContract(contract); 
    return new ResponseEntity<String>(Contract.toJsonArray(contractList), headers, HttpStatus.OK); 
} 

反序列化是在這裏:

public static contract fromJsonToContract(String json) { 
    return new JSONDeserializer<Contract>().use(Calendar.class, new CalendarTransformer("dd-MM-yyyy HH:mm")).use(null, Contract.class).deserialize(json); 
} 

而且這裏的交易方法。

@Transactional 
public static List<Contract> findAllContractsPerContract(Contract contract) { 
    EntityManager e = entityManager().getEntityManagerFactory().createEntityManager(); 
    Session session = e.unwrap(Session.class); 
    Example contractExample = Example.create(contract); 
    Criteria c = session.createCriteria(Contract.class).add(contractExample); 
    List<Contract> list = c.list(); 
    return list; 
} 

用這個例子我得到了結果。

0

是的,但你可能wouldnt得到任何結果。會發生什麼是jpa提供程序(在本例中爲hibernate)會檢測到類型是Entity對象,並根據您提供的實體的@Id進行比較,我猜在這種情況下會有一個空id。

你絕對會做這樣的事情:爲幫助

@Entity 
    @NamedQuery(name="User.findByFirstName", query="SELECT u FROM User u WHERE u.firstName = :firstName") 
    public class User { 
     private String firstname; 
     private String lastname; 
     private String email; 
    } 

,然後在你的會話bean

public class UserBean{ 
    public List<User> findUsers(User user){ 
     return getEntityManager().createNamedQuery("User.findByFirstName") 
       .setParameter("firstName", user.getFirstName()) 
       .getResultList(); 
    } 
    } 
+0

中沒有等效的Hibernate特定感謝您的輸入。這是我目前所擁有的。我的想法是避免寫出所有的參數。是的你是對的,在我的真實應用程序中,對象@Id將爲空。但是,即使我沒有得到任何結果,你是否可以將它如何工作?謝謝 – Patrick