【问题标题】:JPA query using domain object Spring mvc jpa restJPA查询使用域对象Spring mvc jpa rest
【发布时间】:2014-06-26 12:03:27
【问题描述】:

我想知道是否可以使用域对象构建 jpa 查询。

例如:

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

实际上,对象有更多的字段。我收到此对象的有效 json 字符串。但并非所有字段都已填写。

例如,我只填写了名字:

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

这个 JSON 被反序列化为 User 对象

现在我只想使用带有接收参数的对象进行搜索。结果应该是所有名字为 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 添加一些标准,例如“更大或更小”或“喜欢”。因为目前似乎所有条件都用“等于”搜索。

谢谢

【问题讨论】:

标签: java json hibernate rest jpa


【解决方案1】:

是的,但您可能不会得到任何结果。将会发生的是 jpa 提供程序(在本例中为休眠)将检测类型是实体对象并根据您提供的实体的 @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();
     }
   }

【讨论】:

  • 感谢您的意见。这就是我目前所拥有的。我的想法是避免编写所有参数。是的,你是对的,在我的真实应用程序中,@Id 对象将为空。但是,即使我没有结果,你能发布它如何工作的方式吗?谢谢
【解决方案2】:

感谢您到目前为止的帮助。我找到了使用实体搜索合同的解决方案。在这个解决方案中,我发布了一些更新的合同值和其他方法。

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

通过这个例子,我得到了结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 2020-06-20
    • 2016-04-07
    • 2016-01-31
    • 2020-03-29
    • 2018-10-31
    • 2016-06-03
    相关资源
    最近更新 更多