Пример использования Когда внутри Конструктора JPQL - PullRequest
0 голосов
/ 09 мая 2018

Я сейчас пытаюсь сделать запрос через конструктор в JPQL. Например:

em здесь EntityManager

em.createQuery("SELECT NEW {packagePath}.UserDTO(name, status) FROM User", UserDTO.class);

Но я хочу использовать Case When в status, поэтому я попытался сделать запрос:

em.createQuery("SELECT NEW {packagePath}.UserDTO(name, case when status = 'A' then '1' else '0' end as status) FROM User", UserDTO.class);

Я пытался запросить это в SQL Developer:

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? Если нет, пожалуйста, дайте мне несколько советов о том, как сделать это другим способом. Спасибо.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Сообщения об ошибках появляются, чтобы сообщить, что Case-Statement возвращает String, поэтому вы должны предоставить String, String-constructer для обработки этого случая.

Но вы также можете удобно обработать преобразование в существующем конструкторе, чтобы избежать оператора case.

0 голосов
/ 09 мая 2018

Вы должны предоставить способ конвертировать ваш 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);
    }
}
...