在我的测试应用程序中,我试图创建一个springboot api。我已经创建了一个api,通过它我可以得到一个包含重复id(sid)的对象列表。现在,我想按sid筛选该列表,并将值(custRefId)与相应的ID合并。
列出Api的输出:
[
{
"sId": 101,
"sName": "Nike",
"custRefId": "S1234567890a1001INR"
},
{
"sId": 201,
"sName": "Addidas",
"custRefId": "S1234567895a1004INR"
},
{
"sId": 501,
"sName": "U.S Polo",
"custRefId": "S1234567000a1258INR"
},
{
"sId": 501,
"sName": "U.S Polo",
"custRefId": "S1234567000a1011INR"
},
{
"sId": 501,
"sName": "U.S Polo",
"custRefId": "S1234567899a1008INR"
}
]
所需输出:
{
"sId": 101,
"sName": "Nike",
"custRefId": "S1234567890a1001INR"
},
{
"sId": 201,
"sName": "Addidas",
"custRefId": "S1234567895a1004INR"
},
{
"sId": 501,
"sName": "U.S Polo",
"custRefId": {"S1234567000a1258INR","S1234567000a1011INR","S1234567899a1008INR"}
}
enter code here
我的测试bean
package com.example.easynotes.model;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import com.example.easynotes.controller.CompositeKeyEntity;
@Entity(name = "TestApi")
@Table(name="test")
public class TestApi implements Serializable{
/**
*
*/
private static final long serialVersionUID = -6972984895555407355L;
@EmbeddedId
private CompositeKeyEntity CompositeKeyEntity;
@Column(name = "S_Id")
private Long sId;
@Column(name = "S_Name")
private String sName;
@Column(name = "B_Id")
private int bId;
@Column(name = "B_Name")
private String bName;
@Column(name = "Login_Date")
private Date loginDate;
@Column(name = "Amount")
private int amount;
@Column(name = "B_Acc")
private String bAccount;
public TestApi() {
super();
}
public TestApi(com.example.easynotes.controller.CompositeKeyEntity compositeKeyEntity, Long sId, String sName,
int bId, String bName, Date loginDate, int amount, String bAccount) {
super();
CompositeKeyEntity = compositeKeyEntity;
this.sId = sId;
this.sName = sName;
this.bId = bId;
this.bName = bName;
this.loginDate = loginDate;
this.amount = amount;
this.bAccount = bAccount;
}
public CompositeKeyEntity getCompositeKeyEntity() {
return CompositeKeyEntity;
}
public void setCompositeKeyEntity(CompositeKeyEntity compositeKeyEntity) {
CompositeKeyEntity = compositeKeyEntity;
}
public Long getsId() {
return sId;
}
public void setsId(Long sId) {
this.sId = sId;
}
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;
}
public int getbId() {
return bId;
}
public void setbId(int bId) {
this.bId = bId;
}
public String getbName() {
return bName;
}
public void setbName(String bName) {
this.bName = bName;
}
public Date getLoginDate() {
return loginDate;
}
public void setLoginDate(Date loginDate) {
this.loginDate = loginDate;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public String getbAccount() {
return bAccount;
}
public void setbAccount(String bAccount) {
this.bAccount = bAccount;
}
}
测试API存储库:
package com.example.easynotes.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import com.example.easynotes.controller.CompositeKeyEntity;
import com.example.easynotes.model.TestApi;
@Repository
public interface TestRepo extends JpaRepository<TestApi, CompositeKeyEntity>{
@Query(
value = "SELECT * FROM test WHERE S_Id = :sId",
nativeQuery = true
)
public TestApi getSDataById(@Param("sId")long sId);
@Query(value="SELECT h.S_Id,h.S_Name,h.B_Id,h.B_Name,h.Login_Date,h.Amount,h.B_Acc,h.S_Acc,h.B_Ref_Id,h.CRR FROM test h order by h.Login_Date asc",nativeQuery = true )
public List<TestApi> getSellerData();
@Query(
value = "SELECT * FROM test WHERE S_Id = :sId and S_Name =:sName",
nativeQuery = true
)
public List<TestApi> findDataBySIDAndSName(long sId, String sName);
}
TestController类:
package com.example.easynotes.controller;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.easynotes.model.TestApi;
import com.example.easynotes.model.TestBean;
import com.example.easynotes.repository.TestRepo;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
@RestController
@RequestMapping("/LCRF")
public class TestController {
List<TestApi> lcrf = new ArrayList<TestApi>();
List<TestApi> tmp = new ArrayList<TestApi>();
@Autowired
TestRepo lRepo;
@Autowired
Assembler assembler;
@GetMapping("/allData")
public List<TestBean> getAll()
{
getMergeIds(assembler.sBBeanList(lRepo.getSellerData()));
return assembler.sBBeanList(lRepo.getSellerData());
}
@GetMapping("/allData/{sellerId}")
public TestApi getSellerDetail(@PathVariable(value = "sellerId")Long sellerId)
{
return lRepo.getSDataById(sellerId);
}
@GetMapping("/allData/{sId}/{sName}")
public List<TestApi> getDataByIdAndName(@PathVariable(value = "sId")Long sId,@PathVariable(value = "sId")String sName)
{
lcrf = lRepo.findDataBySIDAndSName(sId, sName);
return lcrf;
}
public List<TestMergeIds> getMergeIds(List<TestBean> testBean)
{
List<TestBean> testList = new ArrayList<TestBean>();
Multimap<Long, String> multiMap = ArrayListMultimap.create();
TestMergeIds testMergeIdsBean = new TestMergeIds();
for(TestBean bean: testBean) {
multiMap.put(bean.getsId(), bean.getCustRefId());
}
Set<Long> keys = multiMap.keySet();
List<String> targetList = new ArrayList<>();
for (Long key : keys) {
}
System.out.println("Print list values ---111---"+targetList);
return null;
}
}
CompositeKeyEntity类:
package com.example.easynotes.controller;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
@Embeddable
public class CompositeKeyEntity implements Serializable{
private static final long serialVersionUID = 1581433221916043048L;
@Column(name="S_Acc")
private String sAccount;
@Column(name="B_Ref_Id")
private String bRefId;
@Column(name="CRR")
private String crr;
public String getsAccount() {
return sAccount;
}
public void setsAccount(String sAccount) {
this.sAccount = sAccount;
}
public String getbRefId() {
return bRefId;
}
public void setbRefId(String bRefId) {
this.bRefId = bRefId;
}
public String getCrr() {
return crr;
}
public void setCrr(String crr) {
this.crr = crr;
}
}
汇编程序类:
package com.example.easynotes.controller;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import com.example.easynotes.model.TestApi;
import com.example.easynotes.model.TestBean;
@Component
public class Assembler {
public List<TestBean> sBBeanList(final List<TestApi> testApiList)
{
final List<TestBean> SellerBuyerBeanList = new ArrayList<>(testApiList.size());
if(!testApiList.isEmpty())
{
for(final TestApi lcrfApiEntity : testApiList) {
final TestBean sellerBuyerBeanlist = new TestBean();
BeanUtils.copyProperties(lcrfApiEntity, sellerBuyerBeanlist);
sellerBuyerBeanlist.setCustRefId(formSellerBuyerRefId(lcrfApiEntity.getCompositeKeyEntity()));
SellerBuyerBeanList.add(sellerBuyerBeanlist);
}
}
return SellerBuyerBeanList;
}
private String formSellerBuyerRefId(final CompositeKeyEntity compositeKeyEntity)
{
StringBuilder sBuilder=new StringBuilder();
sBuilder.append(compositeKeyEntity.getsAccount());
sBuilder.append(compositeKeyEntity.getbRefId());
sBuilder.append(compositeKeyEntity.getCrr());
return sBuilder.toString();
}
}
enter code here
----------------------------方法1,使用java。util。设置----------------------------
一种简单的方法是使用java。util。设置而不是java。util。列表中,请尝试以下操作:
首先,通过添加“equals”和“hashCode”方法修改实体(TestApi.java):
@Override
public int hashCode() {
int hash = 0;
hash += (sId != null ? sId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
if (!TestApi.class.isAssignableFrom(object.getClass())) {
return false;
}
TestApi other = (TestApi) object;
return !(
(this.sId == null && other.getsId() != null)
|| (this.sId != null && !this.sId.equals(other.getsId()))
);
}
这样java.util.Set将能够在列表中创建一个不同的列表,之后修改您的TestController.java因此它返回一个Set而不是List,如下所示:
@GetMapping("/allData/{sId}/{sName}")
public Set<TestApi> getDataByIdAndName(@PathVariable(value = "sId")Long sId,@PathVariable(value = "sId")String sName)
{
lcrf = lRepo.findDataBySIDAndSName(sId, sName);
return new java.util.LinkedHashSet(lcrf);
}
您必须对要包装为唯一元素列表的每个@Entity执行相同的操作。
----------------------------方法2,指定查询----------------------------
首先,您必须创建一个指定的接口来表示您的结果,将您的TestRepo.java修改为:
@Query(
value = "SELECT DISTINCT sId, sName, custRefId FROM test WHERE S_Id = :sId and S_Name =:sName",
nativeQuery = true
)
public List<UniqueTestApi> findDataBySIDAndSName(long sId, String sName);
界面UniqueTestApi也应该如下所示:
public static interface UniqueTestApi {
Long getSId();
String getSName();
String getCustRefId();
}
之后,您必须在TestController上修改该方法。java收件人:
@GetMapping("/allData/{sId}/{sName}")
public List<UniqueTestApi> getDataByIdAndName(@PathVariable(value = "sId")Long sId,@PathVariable(value = "sId")String sName)
{
lcrf = lRepo.findDataBySIDAndSName(sId, sName);
return lcrf;
}
您可以使用Java8 Streams将其过滤成一组:
Set<TestApi> filteredSet = testApiList.stream()
.collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(TestApi::getSId))));
如果要将其保留为列表,请使用Java 8的另一项功能:
//Temporary set of Long that will filter the Ids
Set<Long> tempSet = new HashSet<>();
//Duplicated Ids
List<Long> duplicatedList = new ArrayList<>();
//The same list but filtered
testApiList.removeIf(e -> {
boolean duplicated = !tempSet.add(e.getSId());
if (duplicated) duplicatedList.add(e.getSId());
return duplicated;
});
添加了重复的列表。
问题内容: 如何过滤Java中的数组? 我有一系列对象,例如汽车: 类: 用: 现在我要过滤汽车阵列,只保留4门或更多: 我应该怎么做? 在使用Vector之前,请执行以下操作: 然后,我将使用Vector的大小创建一个新数组。然后,我将再次遍历向量并填充新数组。我知道这对于简单的事情来说是一个非常大的过程。 我正在使用J2ME。 问题答案: 编辑: 看到ArrayList不在J2ME中,但是基于
我在java fx中有一个tableview,它显示不同类型的数据,如字符串和整数。我想有一个数据过滤器,这样它就可以自动在table View中显示数据。我怎样才能做到这一点呢?目前我正在使用一个函数,但它不起作用。注意:“pers”是我正在使用的类的一个对象
问题内容: 基本上,我有一个名为的结构,主题包含,以及一个标志(有关说明,请参见下面的屏幕截图)。 在应用程序中,我想过滤数据,仅显示具有的主题。 这就是我想要做的: 但这是行不通的。我应该如何处理?在此先感谢您的帮助。 问题答案: 您那里有一些小错误。总体来说还算不错,但是结合起来它们将永远无法正常工作: 调用任何方法都将返回一个新对象 您需要先过滤其价值 您需要遍历结果 结合这些: 我们会定期
所以我有一个JSON url,里面有一些数据,比如名字、纬度和经度。然而,并不是每个对象都有经纬度,我只想显示具有经纬度的对象的名称。 带有lat和LNG的JSON示例对象:
问题内容: 我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点? 我做了一些谷歌搜索,但没有成功。我希望请求继续执行而不执行第二个过滤器。那可能吗? 任何帮助将不胜感激。 问题答案: 您可以在请求中设置一个属性,然后在第二个过滤器中对其进行检查。 您可以像这样简化上面的代码: 这样,您只需检查属性“ executeSecondFilter”的存在
问题内容: 要按单列过滤数据帧(df),如果我们考虑男性和女性的数据,则可以: 问题1-但是,如果数据跨越多年并且我只想看2014年的男性,该怎么办? 用其他语言,我可能会做类似的事情: (除了我要执行此操作,并在新的数据框对象中获取原始数据框的子集) 问题2。如何循环执行此操作,并为每个唯一的年份和性别集创建一个数据框对象(例如,2013-男,2013-女,2014-男和2014-女的df 问题