簡體   English   中英

使用域對象Spring MVC JPA Rest的JPA查詢

[英]JPA query using domain object Spring mvc jpa rest

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

例如:

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

實際上,對象具有更多的字段。 我收到此對象的有效json字符串。 但並非所有字段都已填寫。

例如,我只填寫姓氏:

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

此JSON被反序列化為User對象

現在,我只想使用帶有接收參數的對象進行搜索。 結果應該是名字為Peter的所有User。

問題是是否可以僅將對象提供給查詢?

感謝您的投入


編輯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添加一些條件,例如“更大或更小”或“喜歡”。 因為此刻似乎所有條件都以“等於”搜索。

謝謝

是的,但是您可能不會得到任何結果。 將會發生的事情是,jpa提供程序(在這種情況下為休眠)將檢測類型為Entity對象,並根據您提供的實體的@Id進行比較,我猜在這種情況下,其ID為null。

您肯定需要執行以下操作:

 @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();
     }
   }

到目前為止,感謝您的幫助。 我找到了一種使用實體搜索合同的解決方案。 在此解決方案中,我發布了一些合同和其他方法的更新值。

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

通過這個例子,我得到了結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM