Hibernate: Критерии и createSQLQuery: как получить JSON? - PullRequest
0 голосов
/ 15 апреля 2020

Когда я пытаюсь это сделать, в результате получаю JSON, но это занимает много времени:

        Criteria c = sessionFactory.getCurrentSession().createCriteria(User.class);
        List<User> users = c.list();
        List<User> specialUsers = new ArrayList<>();

        for (User user : users) {
            List<Perm> userPerms = user.getProfile().getPerms();

            for (Perm perm : userPerms) {
                if (perm.getId().equals(SPECIAL_ID)) {
                    specialUsers.add(user);
                }
            }
        }

        return specialUsers;

и JSON выглядит так:

[{"id":111,"name":"Name111"},{"id":222,"name":"Name222"}]

В попытке улучшить производительность я попробовал код ниже. В приложении SQL результаты в порядке, несколько записей пользователей:

        String sql = "SELECT u.id, u.name FROM app.user u inner join app.perms p where u.profile = p.profile AND p.right= :rightId";
        List<User> specialUsers= (List<User>)sessionFactory.getCurrentSession()
                .createSQLQuery(sql)
                .setParameter("rightId", SPECIAL_ID)
                .list();

        return specialUsers;

Теперь 'JSON' выглядит так:

[[111,"Name111"],[222,"Name222"]]

Я попробовал несколько вещей вроде select *, criteria.add(Restrictions...) но безрезультатно. Что я заметил, так это то, что в первом случае specialUsers.toString возвращает правильные данные, во втором случае он возвращает бессмысленные строки, такие как Ljava.lang.Object;@23e1469f.

Любые подсказки, как решить эту проблему?

1 Ответ

0 голосов
/ 16 апреля 2020

Мне удалось решить это таким образом, возможно, не идеально:

        // get ids of all special users
        String sql = "SELECT u.id FROM app.user u inner join app.perms p where u.profile = p.profile AND p.right= :rightId";
        List<Integer> intIds = sessionFactory.getCurrentSession()
                .createSQLQuery(sql)
                .setParameter("rightId", SPECIAL_ID)
                .list();

        // convert to long values
        List<Long> longIds = intIds.stream()
                .mapToLong(Integer::longValue)
                .boxed().collect(Collectors.toList());

        // get all special users
        Criteria c = sessionFactory
                .getCurrentSession()
                .createCriteria(User.class)
                .add(Restrictions.in("id", longIds));

        List<User> specialUsers = c.list();
        return specialUsers;
    }





Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...