Java 如何在spring boot JPA中获得选择性列?
我不熟悉弹簧靴 我有两个实体Invite和UserJava 如何在spring boot JPA中获得选择性列?,java,spring,spring-boot,jpa,spring-data-jpa,Java,Spring,Spring Boot,Jpa,Spring Data Jpa,我不熟悉弹簧靴 我有两个实体Invite和User @Entity public class Invite { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name="email") private String email_id; private String mobile; private
@Entity
public class Invite {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name="email")
private String email_id;
private String mobile;
private String pincode;
private String name;
private String status;
private Date created_on;
private Date updated_on;
//gettes and setters
}
@Entity
public class User {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private int id;
@OneToOne
private Invite invite;
private String firstName;
private String LastName;
@JsonIgnore
private String password;
private Date created_on;
private Date updated_on;
// getters and setters
}
我想要以下数据
+---------+---------------------------------------------+
| id | firstName email_id mobile |
+-------------------+------------+----------------------+
| | | | |
| 1 |Ram | s@mail.com | 1111111111 |
| | | | |
+---------+---------+------------+----------------------+
因此,我在UserRepository中创建了以下查询:
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
@Query("select u.id,u.firstName,i.email_id, i.mobile from User u inner join u.invite i")
public List<User> getUserDetails();
}
我知道这是因为返回值是Object类型的,我正试图将其输入用户
您能告诉我一种不创建额外DTO类或接口而获取任何数据的方法吗?在用户类中为您选择的列编写一个构造函数,并在查询中使用。确保您还在Invite类中为电子邮件和手机使用构造函数,并在User的构造函数中使用它
@Query("select new com.example.jpa.JPA.entity.User(u.id,u.firstName,i.email_id, i.mobile) from User u inner join u.invite i")
public List<User> getUserDetails();
在用户类中为所选列编写构造函数并在查询中使用。确保您还在Invite类中为电子邮件和手机使用构造函数,并在User的构造函数中使用它
@Query("select new com.example.jpa.JPA.entity.User(u.id,u.firstName,i.email_id, i.mobile) from User u inner join u.invite i")
public List<User> getUserDetails();
很好,你已经知道问题是什么了 @查询选择u.id、u.firstName、i.email\u id、i.mobile from User u inner join u.invite i 列出用户详细信息; 您选择了一些列,但要求Data Jpa返回用户对象列表 所以您首先需要了解JPA规范对使用JPQL的说明 从用户u中选择u,其中u.id=:id->这将返回用户类型对象的列表 本机查询是:从用户中选择*,其中ID={您传递的任何值} 从用户u中选择u.username,其中u.id=:id->只返回用户名,也就是说是字符串类型。因此,如果使用,则返回对象类型为字符串类型;如果使用,则返回对象。生成的相应SQL是从用户u中选择u.USERNAME,其中u.id={id} 从用户u中选择u.id,u.username,其中u.id=:id->此返回对象[]。此时需要DTO投影将其映射到所需的适当类型 对于本机JPA实现,您可以使用或 我主要使用JPA规范中的DTO投影,而不使用查询投影,因此我给出了一个DTO投影的示例,但是上面的文档提供了如何使用每个抽象/特性的很好的参考 定义一个类来表示我考虑的DTO和包:com.example。包名很重要,因为您需要完整的类名,以便在JPQL中引用 包com.example; 类UserDTO{ int-id; 字符串名, 字符串电子邮件地址; 字符串移动; //所有args构造函数都是必需的,并且是虚构的 public Userint id、String firstName、String email_id、String mobile{ //任务 } //接球手和接球手 } 在存储库中:
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
@Query("select u.id,u.firstName,i.email_id, i.mobile from User u inner join u.invite i")
public List<User> getUserDetails();
}
@Queryselect new com.example.UserDTOu.id、u.firstName、i.email\u id、i.mobile from User u inner join u.invite i
列出用户详细信息;
最重要的是:新的完全限定的类名所有要获取的列
这就是如何将DTO投影与JPQL和数据Jpa存储库结合使用。很好,您已经知道了问题所在 @查询选择u.id、u.firstName、i.email\u id、i.mobile from User u inner join u.invite i 列出用户详细信息; 您选择了一些列,但要求Data Jpa返回用户对象列表 所以您首先需要了解JPA规范对使用JPQL的说明 从用户u中选择u,其中u.id=:id->这将返回用户类型对象的列表 本机查询是:从用户中选择*,其中ID={您传递的任何值} 从用户u中选择u.username,其中u.id=:id->只返回用户名,也就是说是字符串类型。因此,如果使用,则返回对象类型为字符串类型;如果使用,则返回对象。生成的相应SQL是从用户u中选择u.USERNAME,其中u.id={id} 从用户u中选择u.id,u.username,其中u.id=:id->此返回对象[]。此时需要DTO投影将其映射到所需的适当类型 对于本机JPA实现,您可以使用或 我主要使用JPA规范中的DTO投影,而不使用查询投影,因此我给出了一个DTO投影的示例,但是上面的文档提供了如何使用每个抽象/特性的很好的参考 定义一个类来表示我考虑的DTO和包:com.example。包名很重要,因为您需要完整的类名,以便在JPQL中引用 包com.example; 类UserDTO{ int-id; 字符串名, 字符串电子邮件地址; 字符串移动; //所有args构造函数都是必需的,并且是虚构的 public Userint id、String firstName、String email_id、String mobile{ //任务 } //接球手和接球手 } 在存储库中:
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
@Query("select u.id,u.firstName,i.email_id, i.mobile from User u inner join u.invite i")
public List<User> getUserDetails();
}
@Queryselect new com.example.UserDTOu.id、u.firstName、i.email\u id、i.mobile from User u inner join u.invite i
列出用户详细信息;
最重要的是:新的完全限定的类名所有要获取的列
这就是如何在JPQL和数据Jpa存储库中使用DTO投影的方法。如果您希望在
查询结果或自定义查询结果,只需使用jpa投影即可。使用相关属性方法创建接口如果您想在查询结果中选择字段或自定义查询结果,只需使用jpa投影即可。使用相关属性方法创建一个接口试试这个..这对我来说很有用: spring.jpa.hibernate.naming strategy=org.hibernate.cfg.DefaultNamingStrategy
这是要添加到应用程序中的。属性试试这个..这对我来说很有用: spring.jpa.hibernate.naming strategy=org.hibernate.cfg.DefaultNamingStrategy
这将添加到application.properties中您错过了关键字newselect new com.example.jpa.jpa.entity.Useru.id,new com.example.userdefinedobjcta.firstName from。。。这是有效的语句吗?@JavaLearner no,而是调用用户构造函数中的内部构造函数。您错过了关键字newselect new com.example.jpa.jpa.entity.Useru.id,new com.example.userdefinedobjcta.firstName from。。。这是有效的语句吗?@JavaLearner-Nope,而是调用用户构造函数中的内部构造函数。此外,您需要了解问题与Spring Boot无关。这是一个与JPA相关的问题,可以使用JPA查询或@Query和Query投影接口和类的数据JPA抽象来解决。更正标记并添加到这一点上,您需要了解问题与Spring Boot无关。这是一个与JPA相关的问题,可以使用JPA查询或@Query和Query投影接口和类的数据JPA抽象来解决。更正标记谢谢你。我们可以用同样的方法使用元组吗?是的,检查我共享的链接。是Hibernate的顶级贡献者之一,浏览他的博客是你能做的最好的事情之一。你也应该通过和你能给我看同样的例子使用TupleCan你请检查这个我分享了上面。这里有一个关于DTO和TupleThank的例子。我们可以用同样的方法使用元组吗?是的,检查我共享的链接。是Hibernate的顶级贡献者之一,浏览他的博客是你能做的最好的事情之一。你也应该通过和你能给我看同样的例子使用TupleCan你请检查这个我分享了上面。有一个关于DTO的例子,TupleOP说在不创建额外DTO类或接口的情况下获取任何数据,而TupleOP说在不创建额外DTO类或接口的情况下获取任何数据