在构造函数 JPQL 中使用 Case
Using Case When inside Constructor JPQL
我目前正在尝试通过 JPQL 中的构造函数进行查询。例如:
em
这里是 EntityManager
em.createQuery("SELECT NEW {packagePath}.UserDTO(name, status) FROM User", UserDTO.class);
但是我想在 status
中使用 Case When 所以我尝试查询:
em.createQuery("SELECT NEW {packagePath}.UserDTO(name, case when status = 'A' then '1' else '0' end as status) FROM User", UserDTO.class);
我试图在 SQL 开发者中查询这个:
SELECT name, CASE WHEN status = 'A' THEN '1' ELSE '0' END AS status FROM User
而且效果很好。
示例 DTO 所在位置:
UserDTO.class
public class UserDTO {
private String name;
private Character status;
// Suggested by Viacheslav Shalamov but not working.
public UserDTO(){}
// EDIT
public UserDTO(String name, Character status){
this.name = name;
this.status = status;
}
}
编辑:User.class
@Entity
@Table(name = "User")
public class User {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", length = 100, columnDefinition = "VARCHAR2(100)")
private String name;
@Column(name = "pc_no", length = 3, columnDefinition = "VARCHAR2(3)")
private String pc_no;
@Column(name = "status")
private Character status;
// constructor / get and set
}
错误:
Unable to locate appropriate constructor on class. Expected arguments are: java.lang.String, java.lang.String.
有没有其他方法可以包含 Case When
方法?如果没有,请给我一些关于如何以不同的方法做到这一点的建议。谢谢。
您应该在失败的查询中提供一种将 VARCHAR2 status
从 String
转换为 Character
的方法。
试试这个:
public class UserDTO {
private String name;
private Character status;
public UserDTO(String name, String status){
this.name = name;
this.status = status.charAt(0);
}
}
错误消息接缝告诉 Case-Statement returns 一个字符串,所以你也必须提供一个字符串,字符串构造器来处理这种情况。
但是您也可以在现有的构造函数中方便地处理转换以避免 case 语句。
我目前正在尝试通过 JPQL 中的构造函数进行查询。例如:
em
这里是 EntityManager
em.createQuery("SELECT NEW {packagePath}.UserDTO(name, status) FROM User", UserDTO.class);
但是我想在 status
中使用 Case When 所以我尝试查询:
em.createQuery("SELECT NEW {packagePath}.UserDTO(name, case when status = 'A' then '1' else '0' end as status) FROM User", UserDTO.class);
我试图在 SQL 开发者中查询这个:
SELECT name, CASE WHEN status = 'A' THEN '1' ELSE '0' END AS status FROM User
而且效果很好。
示例 DTO 所在位置:
UserDTO.class
public class UserDTO {
private String name;
private Character status;
// Suggested by Viacheslav Shalamov but not working.
public UserDTO(){}
// EDIT
public UserDTO(String name, Character status){
this.name = name;
this.status = status;
}
}
编辑:User.class
@Entity
@Table(name = "User")
public class User {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", length = 100, columnDefinition = "VARCHAR2(100)")
private String name;
@Column(name = "pc_no", length = 3, columnDefinition = "VARCHAR2(3)")
private String pc_no;
@Column(name = "status")
private Character status;
// constructor / get and set
}
错误:
Unable to locate appropriate constructor on class. Expected arguments are: java.lang.String, java.lang.String.
有没有其他方法可以包含 Case When
方法?如果没有,请给我一些关于如何以不同的方法做到这一点的建议。谢谢。
您应该在失败的查询中提供一种将 VARCHAR2 status
从 String
转换为 Character
的方法。
试试这个:
public class UserDTO {
private String name;
private Character status;
public UserDTO(String name, String status){
this.name = name;
this.status = status.charAt(0);
}
}
错误消息接缝告诉 Case-Statement returns 一个字符串,所以你也必须提供一个字符串,字符串构造器来处理这种情况。
但是您也可以在现有的构造函数中方便地处理转换以避免 case 语句。