当前位置: 首页 > 知识库问答 >
问题:

如何使用JPA EntityManager选择包含外部实体的多列

暴德运
2023-03-14

我试图从具有OneToOne关系的2个表中选择多个列,其中用户将发送他们想要搜索的列,服务器返回结果列表只包含这些列。我有两个类似的实体:

@Table(name = "user")
public class User implements Serializable{
    private static final long serialVersionUID = 1L;

    @Column(name = "id" )
    @Id
    private String id;

    private String name;

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
    @JsonManagedReference
    private Address address;

    //Getters and Setters
}
public class Address  implements Serializable{
    private static final long serialVersionUID = 1L;
    
    @Column(name = "user_id" )
    @Id
    private String id;

    private String houseNr;
    
    @OneToOne
    @JoinColumn(name = "user_id")
    @JsonBackReference
    private Networkdata networkdata;
    
    //Getters and Setters

使用带有元组的EntityManager的搜索函数

public List<?> find(String[] neededFields){
   if(neededFields.length > 0){
      String queryStr = this.createQueryString(neededFields);

      TypedQuery<Tuple> query = em.createQuery(queryStr, Tuple.class);

      List<Map<String, Object>> resultList = new ArrayList<>();
        
      query.getResultList().forEach(tuple -> {
         Map<String, Object> map = new HashMap<>();
         List<TupleElement<?>> elements = tuple.getElements();
         for (TupleElement<?> element : elements ) {
            String alias = element.getAlias();
                    
            map.put(alias, tuple.get(alias));
         }
                
         resultList.add(map);
      });

      return resultList; 
   }
   else{
      return em.createQuery(this.FIND_ALL_STR, User.class).getResultList();
   }
}
[
   {
      "id": "5e4e3c95cd8b290008db6f3c",
      "name": "name",
      "address": {
         "id": "5e4e3c95cd8b290008db6f3c",
         "houseNr": "123ABC"
      }
   }
]
[
   {
      "address": {
         "id": "5e4e3c95cd8b290008db6f3c",
         "houseNr": "123ABC"
      }
   }
]
[
   {
      "id": "5e4e3c95cd8b290008db6f3c",
      "address": null
   }
]

也欢迎其他想法。

共有1个答案

楮阳
2023-03-14

如果从两列中搜索,实际上可以在Adress上使用带外键的内部连接关键字。如果您还想减少搜索,可以使用WHERE子句。从u.Id=a.User.Id上的用户u内部连接地址a中选择u.Id作为Id,a.Address作为Adress。要减少搜索,您可以添加“您喜欢%?1%的地方和喜欢%?1%的按u.ID排序的地方”

更好的是,为了避免头痛,您可以使用RESPONSE类从诸如SELECT new UserAddress(U.ID,a.Address)......中映射出要搜索的列。

我希望我能帮上忙。

 类似资料:
  • 问题内容: 使用实体框架返回人名列表,其中人名包含字符串数组中的文本。 比方说: 和查询 这将编译并运行,但是该过程实际上是从数据库中调用所有记录,然后对返回的数据执行我的where子句。这是有道理的。 有没有一种方法可以重写查询,以便在SQL中生成where子句? 问题答案: 我假设dataContext.People是来自的,并且不涉及实现的指令,例如或。 答案在这里:http : //www

  • 我一直在尝试新的android构建系统,但遇到了一个小问题。我已经编译了自己的aar ActionBarSherlock包,我称之为“ActionBarSherlock”。啊。我想做的是用这个aar来构建我的最终APK。如果我使用compile project(“:ActionBarSherlock”)将整个ActionBarSherlock库作为一个android库模块包含到我的主项目中,我就能

  • Jsoup将每个文本保存为textnode,包括元素之间的\r\n内容。我想要选择页面上的所有真实文本,并选择它的父文本以删除该父文本中的每一个文本。 我现在有这个: 它不会删除包含\n的所有textnodes,所以它会尝试删除正文,因为这是第一个包含textnodes的元素。 我只想选择所有带有文本的元素,并做element.parent().children().remove(); 也没有按照

  • 所以,假设我在这里有这个HTML块:(这是Java JSOUP(顺便说一下)) 现在我有一个元素列表(作为elements类型),我想选择这些元素,但只选择那些在img标记的alt=“”部分中具有“vegetarian”属性的元素。 现在我可以根据是否是素食主义者来选择,例如 meals.select(“img[alt=fegetarian]”) 但这只将实际的img标记作为元素返回,从而丢失了对

  • 问题内容: 我已经完成了连接数据库(MySQL)的项目。现在,我要将项目导出为jar。但是我不知道如何包括其外部依赖项?在Eclipse中有什么方法可以做到这一点,还是应该为此使用任何脚本? 问题答案: 当你将项目导出为“可运行的jar”(在项目->导出->可运行的jar上单击鼠标右键)时,可以选择将所有依赖项打包到生成的jar中。它还有两种其他方式(请参见屏幕截图)来导出库,请在决定使用哪种打包

  • 问题内容: 我正在使用ADO从Excel工作簿导入数据。我在一个工作表上遇到麻烦,其中一个列名包含一个点:“ Col.1”。 我尝试了所有发现的东西:双引号,方括号,后卫。什么都行不通。会引发错误,或者在每行上查询输出“ Col.1”。 鉴于我无法重命名源文件中的列, 如何使用其名称而不是其编号([F1])手动选择此列? 问题答案: 我终于找到了如何从此列中检索数据。 您需要 替换“。” 按“#”