Java 使用域对象Spring mvc JPA rest的JPA查询

Java 使用域对象Spring mvc JPA rest的JPA查询,java,json,hibernate,rest,jpa,Java,Json,Hibernate,Rest,Jpa,我想知道是否可以使用域对象构建jpa查询 例如: @Entity public class User { private String firstname; private String lastname; private String email; } 在现实中,对象有更多的字段。我收到此对象的有效json字符串。但并非所有字段都已填充 例如,我只填写了名字: {"firstname":"Peter","l

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

例如:

       @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);
}
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);
}
控制器接收如下信息:

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);
}
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);
}
@RequestMapping(value=“/search/”,method=RequestMethod.POST,headers=“Accept=application/json”)
public ResponseEntity getVertagFromSearch(@RequestBody String json,UriComponentsBuilder uriBuilder){
Contract Contract=Contract.fromJsonToContract(json);
列表合同列表=合同。findAllContractsPerContract(合同);
返回新的响应属性(Contract.toJsonArray(contractList),标题,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);
}
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);
}
publicstaticcontract fromJsonToContract(字符串json){
返回新的JSONDeserializer();
}
这里是交易方法

 @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;
}
 @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;
}
@Transactional
公共静态列表findAllContractsPerContract(合同){
EntityManager e=EntityManager().GetEntityManager工厂().createEntityManager();
Session Session=e.unwrap(Session.class);
Example contractExample=Example.create(合同);
条件c=session.createCriteria(Contract.class).add(contractExample);
List=c.List();
退货清单;
}
通过这个例子,我得到了结果。现在的问题是,是否可以在sql中添加一些标准,如“更大或更小”或“类似”。因为目前看来所有的标准都是用“equals”搜索的


谢谢

是的,但你可能不会得到任何结果。将会发生的是,jpa提供程序(在本例中为hibernate)将检测类型为实体对象,并根据您提供的实体的@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();
     }
   }
公共类UserBean{
公共列表查找器(用户){
返回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);
}
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);
}
控制器接收如下信息:

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);
}
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);
}
@RequestMapping(value=“/search/”,method=RequestMethod.POST,headers=“Accept=application/json”)
public ResponseEntity getVertagFromSearch(@RequestBody String json,UriComponentsBuilder uriBuilder){
Contract Contract=Contract.fromJsonToContract(json);
列表合同列表=合同。findAllContractsPerContract(合同);
返回新的响应属性(Contract.toJsonArray(contractList),标题,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);
}
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);
}
publicstaticcontract fromJsonToContract(字符串json){
返回新的JSONDeserializer();
}
这里是交易方法

 @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;
}
 @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;
}
@Transactional
公共静态列表findAllContractsPerContract(合同){
EntityManager e=EntityManager().GetEntityManager工厂().createEntityManager();
Session Session=e.unwrap(Session.class);
Example contractExample=Example.create(合同);
条件c=session.createCriteria(Contract.class).add(contractExample);
List=c.List();
退货清单;
}

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

通过示例查看Hibernate。它是特定于Hibernate的,在JPAThanks中没有对应的输入。这就是我现在拥有的。我的想法是避免编写所有参数。是的,你是对的,在我真正的应用程序中,对象@Id将为空。但是你能告诉我,即使我没有结果,它是如何工作的吗?谢谢