[英]Spring MVC REST JSON jQuery dynamic parameters for jpa query
[英]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.