LINUX.ORG.RU

Сообщения WatchCat

 

CMake отказывается подключать пакет.

Форум — Development

CMake выдаёт следующую ошибку:

CMake Error at CMakeLists.txt:55 (find_package):
  Could not find a configuration file for package "COOLER" that is compatible
  with requested version "4.2".

  The following configuration files were considered but not accepted:

    /usr/lib64/cmake/cooler/COOLERConfig.cmake, version: 4.2.12

В тексте CMakeLists.txt указано find_package( COOLER 4.2 REQUIRED CONFIG ) Никакого EXACT в find_package нет, но такое ощущение, что он где-то глобально устанавливается, т.к. если указать find_package( COOLER 4.2.12 REQUIRED CONFIG ), то всё собирается.

CMake стоит версии 3.30.5

Кто-нибудь с таким сталкивался?

 

WatchCat
()

ALT Linux дистрибутивы.

Форум — General

Вопрос к знатокам ALT Linux. Хочу развернуть у себя для виртуалок данный дистрибутив. Вопрос в том, что взять для лёгкой основы наподобие Calculate Scratch Server(и есть ли там такое вообще), т.е. базовая установка с минимумом служб и установленных по умолчанию пакетов, чтобы потом собирать виртуалку под конкретную задачу. И есть ли вообще там такое?

 

WatchCat
()

To mold or not to mold Gentoo?

Форум — Admin

Собственно сам вопрос, а пробовал ли кто-нибудь перевести Дженту на sys-devel/mold и на сколько ощутимо было ускорение при обновлении системы, если таковое было?

 ,

WatchCat
()

postgresql, jsonb и select

Форум — Development

День добрый.

Вот такой вопрос возник. Есть таблица item с полем jsonb и в том жысоне есть такая запись:

{
  "time":{
    "start":"2022-10-12T10:00:00Z",
    "end":"2022-10-12T10:05:00Z",
    ...
  }
}

Хочется вытащить в один select эти поля и запихать в таблицу вида (id, time_t, time_v), где id это id записи в таблице item, time_t это тип времени («start», «end», etc ), ну а time_v это само значение.

Может кто-нибудь подсказать как правильно это сделать?

Я попытался сделать через jsonb_each_text и jsonb_extract_path.
И в результате запроса select jsonb_each_text(jsonb_extract_path( item.data, 'time' )) from item я получаю нечто вида

"(end,1998-10-13T06:58:33Z)"
"(gen,2022-05-16T09:08:57Z)"
"(start,1998-10-13T06:51:55Z)"
"(end,1993-08-25T21:39:23Z)"

В доке по jsonb_each_text советуют делать select * from jsonb_each_text(), но как тут это сделать чтобы получить нормальный результат с полями, я что-то не понимаю.

 , ,

WatchCat
()

clang-15 и unqualified-std-cast-call

Форум — Development

В пятнадцатом шланге появился флаг unqualified-std-cast-call включённый по умолчанию и теперь то что раньше собиралось, падает с вклюённым по умолчанию -Werror,-Wunqualified-std-cast-call.

Вопрос, что это такое и как его лечить, т.к. я походу совсем потерялся в современных плюсах с его темплейтами.

Вот на какой код ругается:

        template<typename... types_t>
        error call(
            rsComm_t*                     _comm,
            const std::string&            _operation_name,
            irods::first_class_object_ptr _fco,
            types_t...                    _t)
        {
            using namespace std;
...
                return adapted_fcn( ctx, &out_param, forward<types_t>(_t)... ); // << error: unqualified call to 'std::forward'

Где

                using adapted_func_type = std::function<error(plugin_context&, std::string*, types_t...)>;

                adapted_func_type adapted_fcn = [this, &_operation_name](plugin_context& _ctx, std::string* _out_param, types_t... _t) {

Падает всё сообщением:

In file included from /var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/src/clientLogin.cpp:6:
In file included from /var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_auth_plugin.hpp:5:
In file included from /var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_auth_types.hpp:9:
/var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_plugin_base.hpp:284:54: error: unqualified call to 'std::forward' [-Werror,-Wunqualified-std-cast-call]
                return adapted_fcn( ctx, &out_param, forward<types_t>(_t)... );
                                                     ^
                                                     std::
/var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/src/clientLogin.cpp:284:24: note: in instantiation of function template specialization 'irods::plugin_base::call<RcComm *, const char *>' requested here
    ret = auth_plugin->call <rcComm_t*, const char* > ( NULL, irods::AUTH_CLIENT_START, auth_obj, _comm, _context );
                       ^
In file included from /var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/src/clientLogin.cpp:6:
In file included from /var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_auth_plugin.hpp:5:
In file included from /var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_auth_types.hpp:9:
/var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_plugin_base.hpp:284:54: error: unqualified call to 'std::forward' [-Werror,-Wunqualified-std-cast-call]
                return adapted_fcn( ctx, &out_param, forward<types_t>(_t)... );
                                                     ^
                                                     std::
/var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_plugin_base.hpp:284:54: error: unqualified call to 'std::forward' [-Werror,-Wunqualified-std-cast-call]
                return adapted_fcn( ctx, &out_param, forward<types_t>(_t)... );
                                                     ^
                                                     std::
/var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/src/clientLogin.cpp:292:24: note: in instantiation of function template specialization 'irods::plugin_base::call<RcComm *>' requested here
    ret = auth_plugin->call <rcComm_t* > ( NULL, irods::AUTH_CLIENT_AUTH_REQUEST, auth_obj, _comm );
                       ^
3 errors generated.

 ,

WatchCat
()

FireFox и userapi.com

Форум — General

Заметил, что в FF на любых страницах не встраиваются изображения с userapi.com. Хотя, если открыть в новой вкладке, то всё нормально загружается. Это у меня так или это FF глючит?

 

WatchCat
()

Git: удаление старого дерева в репозитории после rebase.

Форум — Development

Было git-дерево A0-B0-C0-D0-E0-...
Решил сделать его ребейз с корня со слиянием коммитов и в итоге получилось совершенно новое дерево A1-B1-D1-E1-....
Так вот, в репозитории хранится оба дерева. Тот же qgit показывает всю репу как A0-B0-...-Z0 A1-B1-...-Z1
Вопрос, как удалить старое дерево в репозитории без его пересоздания?

 

WatchCat
()

mkfs.ext4 fail

Форум — Admin

Пытаюсь создать файловую систему и тут меня посылают нафиг:

mkfs.ext4 /dev/mapper/data3
mke2fs 1.45.5 (07-Jan-2020)
Invalid filesystem option set: fast_commit,has_journal,extent,huge_file,flex_bg,metadata_csum,64bit,dir_nlink,extra_isize

Что ей не нравится?

gentoo старая и не обновлялась уже года два и не может обновиться, а переустанавливать нет сейчас времени.

 ,

WatchCat
()

Wolfire Games опубликовала исходники Overgrowth

Новости — Игры
Wolfire Games опубликовала исходники Overgrowth
Группа Игры

Разработчики Overgrowth опубликовали на Github исходники игры под лицензией Apache 2.0.

При этом в опубликованные исходники не входят ассеты игры. Для доступа к ассетам необходимо купить оригинальную игру в Humble Bundle или Steam.

>>> Исходники на Github

 , ,

WatchCat
()

Это баг в GCC 11.2 или я что-то упустил?

Форум — Development

После обновы до 11.2 столкнулся с тем, что следующий код перестал компилироваться:

#include <iostream>
using namespace std;

#pragma pack(1)
struct RGBA {
    union {
        uint32_t word;
        struct {
            uint8_t r;
            uint8_t g;
            uint8_t b;
            uint8_t a;
        } rgba;
};
};
#pragma pack()

const RGBA RGBA_WHITE = { .rgba = { 0xff, 0xff, 0xff, 0xff } };
const RGBA RGBA_RED   = { .rgba = { 0xff, 0x00, 0x00, 0xff } };
const RGBA RGBA_GREEN = { .rgba = { 0x00, 0xff, 0x00, 0xff } };
const RGBA RGBA_BLUE  = { .rgba = { 0x00, 0x00, 0xff, 0xff } };
const RGBA RGBA_BLACK = { .rgba = { 0x00, 0x00, 0x00, 0xff } };
const RGBA RGBA_GREY  = { .rgba = { 0x80, 0x80, 0x80, 0xff } };
const RGBA RGBA_NONE  = { .rgba = { 0x00, 0x00, 0x00, 0x00 } };

int main(){
    auto color = RGBA_WHITE;
    cout << color.word << endl;
    color = RGBA_RED;
    cout << color.word << endl;
    return 0;
}

gcc 11.1 и ранее нормально компилируют, gcc 11.2 и trunk выдают ошибку:

source>:18:62: error: too many initializers for 'RGBA::<unnamed union>'
   18 | const RGBA RGBA_WHITE = { .rgba = { 0xff, 0xff, 0xff, 0xff } };
      |                                                              ^
<source>:19:62: error: too many initializers for 'RGBA::<unnamed union>'
   19 | const RGBA RGBA_RED   = { .rgba = { 0xff, 0x00, 0x00, 0xff } };
      |                                                              ^
WatchCat
()

Индексация JSONB в PostgreSQL для timestamp

Форум — Development

Есть некая таблица хранящая JSONB в котором есть примерно следующие значения:

{
  "time": {
    "start": "2020-09-11T21:31:04Z"
    "end": "2020-09-11T21:44:10Z",
  }
}

И хочется их проиндексировать для ускорения поиска.

Но вот дело в том, что в строке хранится по сути «timestamp with timezone», а на него постгря ругается:

CREATE INDEX gen_time_index ON item (((data->'time'->>'start')::timestamp));

ERROR: ОШИБКА:  функции в индексном выражении должны быть помечены как IMMUTABLE

SQL state: 42P17

Как бы это можно было бы обойти?

Да, можно конечно завести отдельную таблицу/поле с типом timestamp и триггером заполнять. Но хотелось бы без лишних телодвижений.

 ,

WatchCat
()

Как перекинуть корзину(enclosure) с одной LSI карточки на другую?

Форум — Linux-hardware

Есть машина с LSI контроллером(9361-8i) к которому на внешние SAS-разъёмы(SFF-8087 to SFF-8088 адаптер) подключено два ящика с дисками и на них развёрнуты рейды(на каждой корзине свой).

Необходимо одну корзину перекинуть на другой LSI контроллер(LSI 9380-8e) на другой машине без потерь данных.

Вопрос, как это сделать корректно? Если просто переткнуть кабель, карточка корректно подхватит или необходимы какие-то телодвижения?

Про storcli /cX get config file=file_name знаю. Но эта команда сохраняет весь конфиг карточки, а не отдельных элементов.

 ,

WatchCat
()

with recursive в PostgreSQL

Форум — Development

Есть банальная таблица для хранения древовидной структуры:

CREATE TABLE test (
   tid serial PRIMARY KEY,
   pid INTEGER,
   name VARCHAR NOT NULL
   -- на самом деле тип name это домен с проверкой, но в данном случае это не важно КМК
   -- да и constraint'ы опустим.
);

И есть две задачи:

  • Найти запись в соответствии с заданным путём n1.n2.n3.n4
  • Найти ближайший элемент к заданному пути. Т.е. например для n1.n2.n3.n4 вернуть запись с путём n1.n2 т.к. у n1.n2 нет потомков.

Покопавшись с WITH RECURSIVE для первой задачи получилось такое себе решение:

WITH RECURSIVE r1 as (
  SELECT t1.tid, t1.pid, t1.name, cast( t1.name as text ) as path
  FROM test t1 WHERE pid is null and t1.name = split_part('n1.n2.n3.n4', '.', 1)
    UNION
  SELECT t2.tid, t2.pid, t2.name, r1.path || '.'|| t2.name as path
  FROM test t2
  join r1 on t2.pid = r1.id
)
select * from r1 where path = 'n1.n2.n3.n4';

Хотя меня несколько напрягает сравнение строк, но я не уверен как сделать быстрее.

И по второму вопросу не могу докумекать, как всё это реализовать. Может кто-нибудь чего подскажет?

 ,

WatchCat
()

Modern CMake пакеты и их <package>-config.cmake

Форум — Development

Если раньше после успешного выполнения find_package появлялось множество переменных вида <package_name>_..., как например у libarchive:

-- LIBARCHIVE_CFLAGS=
-- LIBARCHIVE_CFLAGS_I=
-- LIBARCHIVE_CFLAGS_OTHER=
-- LIBARCHIVE_FOUND=1
-- LIBARCHIVE_INCLUDEDIR=/usr/include
-- LIBARCHIVE_INCLUDE_DIRS=
-- LIBARCHIVE_LDFLAGS=-larchive
-- LIBARCHIVE_LDFLAGS_OTHER=
-- LIBARCHIVE_LIBDIR=/usr/lib64
-- LIBARCHIVE_LIBRARIES=archive
-- LIBARCHIVE_LIBRARY_DIRS=
-- LIBARCHIVE_LIBS=
-- LIBARCHIVE_LIBS_L=
-- LIBARCHIVE_LIBS_OTHER=
-- LIBARCHIVE_LIBS_PATHS=
-- LIBARCHIVE_LINK_LIBRARIES=/usr/lib64/libarchive.so
-- LIBARCHIVE_MODULE_NAME=libarchive
-- LIBARCHIVE_PREFIX=/usr
-- LIBARCHIVE_STATIC_CFLAGS=
-- LIBARCHIVE_STATIC_CFLAGS_I=
-- LIBARCHIVE_STATIC_CFLAGS_OTHER=
-- LIBARCHIVE_STATIC_INCLUDE_DIRS=
-- LIBARCHIVE_STATIC_LDFLAGS=-larchive;-lcrypto;-lacl;-llzo2;-llzma;-lzstd;-llz4;-lbz2;-lz;-lxml2
-- LIBARCHIVE_STATIC_LDFLAGS_OTHER=
-- LIBARCHIVE_STATIC_LIBDIR=
-- LIBARCHIVE_STATIC_LIBRARIES=archive;crypto;acl;lzo2;lzma;zstd;lz4;bz2;z;xml2
-- LIBARCHIVE_STATIC_LIBRARY_DIRS=
-- LIBARCHIVE_STATIC_LIBS=
-- LIBARCHIVE_STATIC_LIBS_L=
-- LIBARCHIVE_STATIC_LIBS_OTHER=
-- LIBARCHIVE_STATIC_LIBS_PATHS=
-- LIBARCHIVE_VERSION=3.5.1
-- LIBARCHIVE_libarchive_INCLUDEDIR=
-- LIBARCHIVE_libarchive_LIBDIR=
-- LIBARCHIVE_libarchive_PREFIX=
-- LIBARCHIVE_libarchive_VERSION=

Т.е. делаешь target_link_libraries(target ${LIBARCHIVE_LIBRARIES}) или там target_include_directories и вроде всё понятно что откуда берётся с чем линкуется. Теперь же многие переходят на -config.cmake и там вообще толком никаких переменных не объявляется. Как например у libfmt:

-- fmt_CONFIG=/usr/lib64/cmake/fmt/fmt-config.cmake
-- fmt_CONSIDERED_CONFIGS=/usr/lib64/cmake/fmt/fmt-config.cmake
-- fmt_CONSIDERED_VERSIONS=7.0.3
-- fmt_DIR=/usr/lib64/cmake/fmt
-- fmt_FOUND=1
-- fmt_VERSION=7.0.3
-- fmt_VERSION_COUNT=3
-- fmt_VERSION_MAJOR=7
-- fmt_VERSION_MINOR=0
-- fmt_VERSION_PATCH=3
-- fmt_VERSION_TWEAK=0

Т.е. ни _INCLUDEDIR, ни _LIBRARIES нет. И вот как с этим работать? Как мне линковать мой таргет с libfmt? Кто-нибудь может подсказать?

 

WatchCat
()

std::copy_n не перемещает итератор на следующий символ за последним скопированным.

Форум — Development

Собственно код:

#include <string>
#include <iostream>
#include <sstream>
#include <algorithm>
using namespace std;

int main(){
    string src("01234567890123456789");

    string dst1;
    dst1.reserve(6);

    string dst2;
    dst2.reserve(6);

    istringstream is(src);

    copy_n( std::istreambuf_iterator<char>( is ), 6, std::back_inserter( dst1 ) );
    cout << dst1 << endl;

    copy_n( std::istreambuf_iterator<char>( is ), 6, std::back_inserter( dst2 ) );
    cout << dst2 << endl;
}

Вывод:

$ g++ t.cpp && ./a.out 
012345
567890

Хотя по идее должно быть:

012345
678901

Или я чего-то не понимаю?

ЗЫ:

$ g++ -v
Используются внутренние спецификации.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/9.3.0/lto-wrapper
Целевая архитектура: x86_64-pc-linux-gnu
Параметры конфигурации: /var/calculate/tmp/portage/sys-devel/gcc-9.3.0-r1/work/gcc-9.3.0/configure --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/9.3.0 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/9.3.0 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/9.3.0/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/9.3.0/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include/g++-v9 --with-python-dir=/share/gcc-data/x86_64-pc-linux-gnu/9.3.0/python --enable-languages=c,c++,objc,fortran --enable-obsolete --enable-secureplt --disable-werror --with-system-zlib --enable-nls --without-included-gettext --enable-checking=release --with-bugurl=https://bugs.gentoo.org/ --with-pkgversion='Gentoo 9.3.0-r1 p3' --disable-esp --enable-libstdcxx-time --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-multilib --with-multilib-list=m32,m64 --disable-fixed-point --enable-targets=all --enable-libgomp --disable-libmudflap --disable-libssp --disable-libada --disable-systemtap --enable-vtable-verify --enable-lto --with-isl --disable-isl-version-check --enable-default-pie --enable-default-ssp
Модель многопоточности: posix
gcc версия 9.3.0 (Gentoo 9.3.0-r1 p3) 

 

WatchCat
()

char*, string_view и ostream

Форум — Development

Тут с переходом на свежий pqxx вылезла такая проблема.

Если раньше для новых типов в string_traits<T> они требовали реализацию метода string to_sting() и мне было достаточно банального ostringstream, то сейчас они требуют реализацию static zview to_buf (char *begin, char *end, TYPE const &value), т.е. требуется возвращать string_view для заданного буфера.

В общем вопрос простой, как можно использовать ostream для внешнего буфера, используя только библиотечные классы? При этом нельзя переполнять буфер и переалоцировать его тоже.

Пока я так понял, что придётся реализовать свoй basic_streambuf. Т.к. стандартный basic_stringbuf, во-первых, хочет string, а, во-вторых, буфер переданный в string который передадут в ostringstream может быть переаллоцирован.

UPD. Впрочем как оказалось всё достаточно элементарно и давно есть в примерах на cppreference.

template<typename _CharT, class _Traits = char_traits<_CharT>> class my_ostreambuf: public basic_streambuf<_CharT, _Traits> {
private:
protected:
    my_ostreambuf() {
    }
public:
    using _Base = basic_streambuf<_CharT, _Traits>;
    using char_type = typename _Base::char_type;

    my_ostreambuf( char_type* begin, char_type* end ) {
        _Base::setp(begin, end);
    }

    basic_string_view<_CharT, _Traits> get_view() {
        return basic_string_view<_CharT, _Traits>( _Base::pbase(), _Base::pptr() - _Base::pbase() );
    }

    virtual ~my_ostreambuf() = default;
};

typedef my_ostreambuf<char> char_ostreambuf;

 ,

WatchCat
()

Проблемы с загрузкой nvidia драйвера .

Форум — General

Словил тут после обновления Gentoo странную вещь при загрузке драйвера nvidia

[498966.989501] nvidia: version magic '4.19.146-gentoo SMP mod_unload ' should be '4.19.146-gentoo SMP preempt mod_unload '

Версия x11-drivers/nvidia-drivers 435.21-r6

В ядре соответственно preempt включен:

# uname -a
Linux japet 4.19.146-gentoo #6 SMP PREEMPT Thu Oct 22 08:30:10 UTC 2020 x86_64 Intel(R) Core(TM) i5-4200M CPU @ 2.50GHz GenuineIntel GNU/Linux

Более новое не ставлю, т.к. GeForce GT 740M в 440-х и выше вроде не поддерживается а старые nvidia драйвера под более свежими ядрами не собираются.

Собственно, кто неправильно выставляет kernel magic и как это побороть?

 ,

WatchCat
()

проблемы с std::variant of lambda

Форум — Development

Обмазываюсь тут 17-ми плюсами и захотелось поизвращаться.

Есть вот такой пример:

#include <iostream>
#include <variant>
#include <functional>
using namespace std;

int main( int argc, const char* argv[] ) {
    using variant1 = variant< function<void()>, function<void( optional< string > )> >;
    variant1 t1,t2;
    t1 = []() {
        cout << "t1" << endl;
    };
    t2 = []( optional<string> v ) {
        cout << v.value_or( "none!" ) << endl;
    };

    using variant2 = variant< function<void()>, function<void( optional< string > )>, function< void( string ) > >;
    variant2 t3,t4,t5;
    
    t3 = []() {
        cout << "t1" << endl;
    };

    // Вот тут ошибка компиляции
    t4 = []( optional<string> v ) {
        cout << v.value_or( "none!" ) << endl;
    };

    t5 = []( string v ){
        cout << v << endl;
    }

    return 0;
}

И получаю следующую ошибку:

/home/user/tmp/1/test1.cpp:28:2: error: no match for ‘operator=’ (operand types are ‘variant2’ {aka ‘std::variant<std::function<void()>, std::function<void(std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >)>, std::function<void(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)> >’} and ‘main(int, const char**)::<lambda(std::optional<std::__cxx11::basic_string<char> >)>’)

Понятно, что проблема решается прямым указанием типа:

    t4 = ( function<void( optional< string > )> ) []( optional<string> v ) {
        cout << v.value_or( "none!" ) << endl;
    };

Но мне интересно, в чём тут грабли. Т.е. по каким-то причинам компилятор перестал распознавать сигнатуру? Путает optional<string> и string? Или что тут такое может быть?

 

WatchCat
()

Компактная библиотека для растровой графики для C++.

Форум — Development

Посоветуйте subj?
Надо что-то, что может работать со слоями и примитивами.
Т.е. наложить один битмап на другой с использованием маски/альфаканала/етц и нарисовать сверху примитивы и текст.
Желательно на C++ и с возможностью статической линковки.
Ну и сохранить это всё в один зи форматов по выбору, png/jpeg/tiff/etc. Всё это должно работать без каких либо гуёв и 3d ускорения.

GTK и Qt мне кажутся несколько оверкилл.
Да, ImageMagick сейчас используется, но без матов о некоторых его особенностях высказаться не могу.

 , ,

WatchCat
()

left outer join и проблемы с JPQL.

Форум — Development

Есть два стула… т.е. две таблицы.

CREATE TABLE scheme
(
    id integer NOT NULL,
    command character varying(1024),
    CONSTRAINT scheme_pkey PRIMARY KEY (id)
)

и

CREATE TABLE task
(
    id integer NOT NULL,
    scheme_id integer NOT NULL,
    CONSTRAINT task_pkey PRIMARY KEY (id),
    CONSTRAINT task_to_scheme_fk FOREIGN KEY (scheme_id)
        REFERENCES scheme (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE
        DEFERRABLE
)

К ним есть два JPA-класса.

@Entity
public class Scheme {

    @Id
    @GeneratedValue
    private Integer id;

    @Basic
    private String command;

}

и

@Entity
public class Task {

    @Id
    @GeneratedValue
    private Integer id;

    @ManyToOne( optional = false )
    @JoinColumn( name = "scheme_id" )
    private Scheme scheme;

}

И мне надо посчитать сколько task у каждой scheme. В том же sql это делается просто:

SELECT scheme.id AS scm, count(task.id) AS cnt
FROM scheme
LEFT OUTER JOIN task on task.scheme_id = scheme.id
GROUP BY scheme.id
ORDER BY cnt ASC, scm ASC;

И вывод:

11	"0"
1	"4"
2	"4"
4	"4"
6	"4"

Вопрос, как сделать тот же запрос на JPQL? Т.к. что-то в лоб повторить запрос не вытанцовывается, все варианты выдают ошибку на этапе компиляции запроса.

 , jpql

WatchCat
()

RSS подписка на новые темы