SQL Query to change Hibernate 5 CriteriaQuery - spring

My SQL Query look like:
select rtnstatus_id,crs_filedt,(select rtnstatus_code from mst_rtnstatus where mst_rtnstatus.rtnstatus_id = txn_crs.rtnstatus_id )AS rtnstatus_code from txn_crs where mclient_id='44' and gstn_cid='10306' and rtnperiod_id=
(select rtnperiod_id from mst_rtnperiod where year_id=4 and month_id=10 and formtype_id=
(select formtype_id from mst_formtype where formtype_name='GSTR1')
and dlrtype_id=ifnull((select dlrtype_id from txn_clientdlr where mclient_id=44 and month_id=10 and year_id=4 order by clientdlr_id desc limit 1),(SELECT dlrtype_id FROM mst_dlrtype WHERE dlrtype_code='R')) order by rtnperiod_id desc limit 1 ) limit 1;
I Want to Change this query to CriteraQuery Hibernate 5, How i can do this,Plz Help me..
CriteriaBuilder builder = _getSession().getCriteriaBuilder();
CriteriaQuery<Object[]> criteriaQuery = builder.createQuery(Object[].class);
Root<TxnCrs> root = criteriaQuery.from(TxnCrs.class);
// For MstRtnstatus to get rtnstatusCode
Subquery<Object> subQueryStatus = criteriaQuery.subquery(Object.class);
Root<MstRtnstatus> subRootStatus = subQueryStatus.from(MstRtnstatus.class);
subQueryStatus.select(subRootStatus.get("rtnstatusCode"));
subQueryStatus.where(builder.equal(subRootStatus.get("rtnstatusId"),root.get("rtnstatusId")));
// For MstFormtype to get formtypeId
Subquery<Object> subQueryFormType = criteriaQuery.subquery(Object.class);
Root<MstFormtype> subRootFormType = subQueryFormType.from(MstFormtype.class);
subQueryFormType.select(subRootFormType.get("formtypeId"));
subQueryFormType.where(builder.equal(subRootFormType.get("formtypeName"),formType));
//For TxnClientdlr to get dlrtypeId
Subquery<Object> subQueryDlr = criteriaQuery.subquery(Object.class);
Root<TxnClientdlr> subRootDlr = subQueryDlr.from(TxnClientdlr.class);
subQueryDlr.select(subRootDlr.get("dlrtypeId"));
subQueryDlr.where(builder.equal(subRootDlr.get("mclientId"),mclientId),builder.equal(subRootDlr.get("monthId"),monthId),
builder.equal(subRootDlr.get("yearId"),yearId));
// For MstDlrtype IF dlrtypeId get Null
Subquery<Object> subQueryDlrType = criteriaQuery.subquery(Object.class);
Root<MstDlrtype> subRootDlrType = subQueryDlrType.from(MstDlrtype.class);
subQueryDlrType.select(subRootDlrType.get("dlrtypeId"));
subQueryDlrType.where(builder.equal(subRootDlrType.get("dlrtypeCode"),"R"));
//For MstRtnperiod to get rtnperiodId
Subquery<Object> subQueryPeriod = criteriaQuery.subquery(Object.class);
Root<MstRtnperiod> subRootPeriod = subQueryPeriod.from(MstRtnperiod.class);
subQueryPeriod.select(subRootPeriod.get("rtnperiodId"));
subQueryPeriod.where(builder.equal(subRootPeriod.get("yearId"),yearId),builder.equal(subRootPeriod.get("monthId"),monthId),
builder.equal(subRootPeriod.get("formtypeId"),subQueryFormType.getSelection()),
How i can write corect way ?
builder.equal(subRootPeriod.get("dlrtypeId"),subQueryDlr.getSelection()
,subRootPeriod.get("dlrtypeId"),subQueryDlrType.getSelection()));**
criteriaQuery.multiselect(root.get("rtnstatusId"),root.get("crsFiledt"),subQueryStatus.getSelection()).
where(builder.equal(root.get("mclientId"),mclientId),builder.equal(root.get("gstnCid"),gstnCid),
builder.equal(root.get("rtnperiodId"),subQueryPeriod.getSelection()));
Query<Object[]> q=_getSession().createQuery(criteriaQuery);

Related

KAFKA JDBC Source connector adds the default schema

I use the KAFKA JDBC Source connector to read from the database ClickHouse (driver - clickhouse-jdbc-0.2.4.jar) with incrementing mod.
Settings:
batch.max.rows = 100
catalog.pattern = null
connection.attempts = 3
connection.backoff.ms = 10000
connection.password = [hidden]
connection.url = jdbc:clickhouse://<ip>:8123/<schema>
connection.user = user
db.timezone =
dialect.name =
incrementing.column.name = id
mode = incrementing
numeric.mapping = null
numeric.precision.mapping = false
poll.interval.ms = 5000
query =
query.suffix =
quote.sql.identifiers = never
schema.pattern = null
table.blacklist = []
table.poll.interval.ms = 60000
table.types = [TABLE]
table.whitelist = [<table_name>]
tables = [default.<schema>.<table_name>]
timestamp.column.name = []
timestamp.delay.interval.ms = 0
timestamp.initial = null
topic.prefix = staging-
validate.non.null = false
Why does the connector additionally substitute the default scheme? and how to avoid it?
Instead of a request
SELECT * FROM <schema>.<table_name> WHERE <schema>.<table_name>.id > ? ORDER BY <schema>.<table_name>.id ASC
I get an error with
SELECT * FROM default.<schema>.<table_name> WHERE default.<schema>.<table_name>.id > ? ORDER BY default.<schema>.<table_name>.id ASC
You can create CH data source object like below (Where schema name is not passed).
final ClickHouseDataSource dataSource = new ClickHouseDataSource(
"jdbc:clickhouse://"+host+"/"+user+"?option1=one%20two&option2=y");
Then in SQL query, you can specify a schema name(schema.table). So it will not add the default schema in your query.

How to Convert this Query to Eloquent or Query Builder?

I have a query like this. How should I convert it into a eloquent or query builder
SELECT
x.MATERIAL_ID,
(SELECT TAPET_NAME FROM MA_TAPE_TYPE WHERE TAPET_CODE = x.MATERIAL_TYPE) as media_type,
(SELECT TAPEF_NAME FROM MA_TAPE_FORMAT WHERE TAPEF_CODE = x.MATERIAL_FORMAT) as media_format,
STOCK_MATERIAL_EPI.HOUSE_NO,
x.TXN_DATE,
STOCK_MATERIAL_EPI.PROGRAM_NAME,
CASE WHEN x.iden_flag = 'P' THEN STOCK_MATERIAL_EPI.epi_title WHEN x.iden_flag = 'C'
THEN STOCK_MATERIAL_EPI.prod_version_name WHEN x.iden_flag = 'M' THEN STOCK_MATERIAL_EPI.promo_name
END as episode_title,
PUR_EPISODE_HDR.EPI_NO,
(SELECT MAX (last_date) FROM run_master WHERE run_master.row_id_epi = PUR_EPISODE_HDR.row_id AND
run_master.run_aired = 'Y') as last_tx,
x.REMARKS,
x.LOCATION_ID as shelf_no,
stock_material_slag.remarks as short_list
FROM STOCK_MATERIAL x
LEFT JOIN STOCK_MATERIAL_EPI ON x.MATERIAL_ID = STOCK_MATERIAL_EPI.MATERIAL_ID
LEFT JOIN stock_material_slag ON x.MATERIAL_ID = stock_material_slag.MATERIAL_ID
LEFT JOIN PUR_EPISODE_HDR ON STOCK_MATERIAL_EPI.ROW_ID_EPI = PUR_EPISODE_HDR.ROW_ID
I'm confused as to how to convert them. Can someone help me.
I tried to write like this.
But it doesn't work,
$materials = DB::connection('oracle')
->table('STOCK_MATERIAL AS x')
->select('x.MATERIAL_ID',
DB::raw("(SELECT TAPET_NAME FROM MA_TAPE_TYPE WHERE TAPET_CODE = x.MATERIAL_TYPE) as MEDIA_TYPE"),
DB::raw("(SELECT TAPEF_NAME FROM MA_TAPE_FORMAT WHERE TAPEF_CODE = x.MATERIAL_FORMAT) as MEDIA_FORMAT"),
'x.TXN_DATE',
'y.HOUSE_NO', 'y.PROGRAM_NAME',
DB::raw("(CASE WHEN x.IDEN_FLAG = 'P' THEN z.EPI_TITLE WHEN x.IDEN_FLAG = 'C' THEN z.PROD_VERSION_NAME WHEN x.IDEN_FLAG = 'M' THEN z.PROMO_NAME END as EPISODE_TITLE)"),
'w.EPI_NO',
DB::raw("(SELECT MAX (LAST_DATE) FROM RUN_MASTER WHERE RUN_MASTER.ROW_ID_EPI = w.ROW_ID AND RUN_MASTER.RUN_AIRED = 'Y') as LAST_TX"),
'z.REMARKS',
'x.LOCATION_ID as SHELF_NO',
'z.REMARKS'
)
->leftJoin('STOCK_MATERIAL_EPI AS y', 'y.MATERIAL_ID', '=', 'x.MATERIAL_ID')
->leftJoin('STOCK_MATERIAL_SLAG AS z', 'z.MATERIAL_ID', '=', 'x.MATERIAL_ID')
->leftJoin('PUR_EPISODE_HDR AS w', 'w.ROW_ID', '=', 'y.ROW_ID_EPI')
What else do I write right?
You would need to define eloquent models and then use with(). Documentation can be found at the link below: https://laravel.com/docs/7.x/eloquent-relationships#constraining-eager-loads
example
StockMaterial::with([
'maTapeType' => function($query) {
$query->get('name')
})
])
For Query Builder you DB::raw and DB::leftJoin to create the same query.
DB::from('STOCK_MATERIAL')
->selectRaw([
'TAPET_NAME as media_type',
'CASE WHEN x.iden_flag = "P" THEN STOCK_MATERIAL_EPI.epi_title
WHEN x.iden_flag = "C" THEN STOCK_MATERIAL_EPI.prod_version_name
WHEN x.iden_flag = "M" THEN STOCK_MATERIAL_EPI.promo_name
END as episode_title',
])
->leftJoin('MA_TAPE_TYPE', 'TAPET_CODE', 'STOCK_MATERIAL.MATERIAL_TYPE')
https://laravel.com/docs/7.x/queries#raw-expressions
https://laravel.com/docs/7.x/queries#joins

C#: LINQ not returning the same result as SQL

I'm trying to convert the following SQL query to LINQ, but getting different result count with both,
SQL Query:
SELECT T5.CNTR, T5.BenefitCode,T5.ApprovedFlag,
T5.PaymentFrequencyCode, T5.InstalmentAmt, T5.TotalAmt,
T5.CarRego
FROM
dbo.EmployeeBenefit As T5
LEFT JOIN dbo.Payee ON T5.PayeeCntr = dbo.Payee.CNTR
LEFT JOIN dbo.BankDetails ON dbo.Payee.BankCntr = dbo.BankDetails.BankCntr
Left Join dbo.EmployeeCar As T4 on T5.EmployeeCarCntr=T4.Cntr
Inner Join dbo.EmployeeEntity As T1 On T5.EmployeeEntityCntr=T1.EmployeeEntityCntr
Inner Join dbo.EmployerEntity As T2 On T1.EmployerEntityCntr=T2.EmployerEntityCntr
where T5.EmployeeCntr = 117165
AND ((T5.EndDate is Null) OR (T5.EndDate >= GETDATE()))
LINQ:
var result = (from employeeBenefit in context.EmployeeBenefit
from payee in context.Payee.Where(x => x.Cntr == employeeBenefit.PayeeCntr).DefaultIfEmpty()
from bankDetails in context.BankDetails.Where(x => x.BankCntr == employeeBenefit.PayeeCntr).DefaultIfEmpty()
from employeeCar in context.EmployeeCar.Where(x => x.Cntr == payee.BankCntr).DefaultIfEmpty()
from employeeEntity in context.EmployeeEntity
where employeeEntity.EmployeeEntityCntr == employeeBenefit.EmployeeEntityCntr
from employeeEntity1 in context.EmployeeEntity
where employeeEntity.EmployerEntityCntr == employeeEntity1.EmployerEntityCntr
&& employeeBenefit.EmployeeCntr == iEmployeeID
&& (!employeeBenefit.EndDate.HasValue || employeeBenefit.EndDate >= DateTime.Now)
&& employeeBenefit.EmployeeCntr == 117165
&& employeeBenefit.CarRego == registration
select new
{
CNTR = employeeBenefit.Cntr,
BenefitCode = employeeBenefit.BenefitCode,
PaymentFrequencyCode = employeeBenefit.PaymentFrequencyCode,
InstalmentAmount = employeeBenefit.InstalmentAmt,
TotalAmount = employeeBenefit.TotalAmt,
CarRego = employeeBenefit.CarRego,
ApprovedFlag = employeeBenefit.ApprovedFlag
}).ToList();
Please let me know what i'm missing.
For the data in my database the SQL query is returning 10 records. But, the LINQ is returning 2700 records.
Not a full answer (I'm late for work) but:
var result = (from T5 in context.EmployeeBenefit
join PY in dbo.Payee on T5.PayeeCntr equals PY.CNTR into PY1
where T5.EmployeeCntr = 117165
select new {
CNTR = T5.Cntr,
...
}
).ToList();
It was the issue with the condition mismatch that i had done in the LINQ. The below query just worked fine. Thank you for helping me with the issue.
var result = (from employeeBenefit in context.EmployeeBenefit
from payee in context.Payee.Where(x => x.Cntr == employeeBenefit.PayeeCntr).DefaultIfEmpty()
from bankDetails in context.BankDetails.Where(x => x.BankCntr == payee.BankCntr).DefaultIfEmpty()
from employeeCar in context.EmployeeCar.Where(x => x.Cntr == employeeBenefit.EmployeeCarCntr).DefaultIfEmpty()
join employeeEntity in context.EmployeeEntity
on employeeBenefit.EmployeeEntityCntr equals employeeEntity.EmployeeEntityCntr
join employerEntity in context.EmployerEntity
on employeeEntity.EmployerEntityCntr equals employerEntity.EmployerEntityCntr
where employeeBenefit.EmployeeCntr == 117165 && (!employeeBenefit.EndDate.HasValue || employeeBenefit.EndDate >= DateTime.Now)
select new
{
CNTR = employeeBenefit.Cntr,
BenefitCode = employeeBenefit.BenefitCode,
PaymentFrequencyCode = employeeBenefit.PaymentFrequencyCode,
InstalmentAmount = employeeBenefit.InstalmentAmt,
TotalAmount = employeeBenefit.TotalAmt,
CarRego = employeeBenefit.CarRego,
ApprovedFlag = employeeBenefit.ApprovedFlag
}).ToList();

Ignore null and get full result

I have below linq select coding. The result become empty if db.actions.ACTC_DBID values are null. How to avoid that. I need to get the query result with null values.
var apList = (from r in db.components
join o in db.cmp_actionpanel on r.CMP_DBID equals o.CMP_DBID
join u in db.cmp_button on o.BTN_DBID equals u.BTN_DBID
join a in db.actions on o.ACTC_DBID equals a.ACTC_DBID
where (r.ORG_DBID == org && r.CMP_DBID == id)
orderby o.ORDER_IDX
select new
{
AP_DBID = o.AP_DBID,
CMP_NAME = r.CMP_NAME,
CMP_DBID = r.CMP_DBID,
BTN_NAME = u.BTN_NAME,
BTN_DBID = u.BTN_DBID,
ORDER_IDX = o.ORDER_IDX,
ALWAYS_VISIBLE = o.ALWAYS_VISIBLE,
ACTC_DBID = a.ACTC_DBID,
ACTION_CODE = a.ACTION_CODE,
ACTION_CMP_DBID = o.ACTION_CMP_DBID,
STARTS_JOB_PROGRESSION = o.STARTS_JOB_PROGRESSION,
VISIBLE_ON = o.VISIBLE_ON,
CAPTURE_INFO = o.CAPTURE_INFO,
COMMAND = o.COMMAND
}).ToList();
var apList = (from r in db.components
join o in db.cmp_actionpanel on r.CMP_DBID equals o.CMP_DBID
join u in db.cmp_button on o.BTN_DBID equals u.BTN_DBID
join a in db.actions on o.ACTC_DBID equals a.ACTC_DBID into aGroup
where (r.ORG_DBID == org && r.CMP_DBID == id)
orderby o.ORDER_IDX
from ag in aGroup.DefaultIfEmpty()
select new
{
AP_DBID = o.AP_DBID,
CMP_NAME = r.CMP_NAME,
CMP_DBID = r.CMP_DBID,
BTN_NAME = u.BTN_NAME,
BTN_DBID = u.BTN_DBID,
ORDER_IDX = o.ORDER_IDX,
ALWAYS_VISIBLE = o.ALWAYS_VISIBLE,
ACTC_DBID = ag.ACTC_DBID == null ? (int?)null : ag.ACTC_DBID,
ACTION_CODE = ag.ACTION_CODE,
ACTION_CMP_DBID = o.ACTION_CMP_DBID,
STARTS_JOB_PROGRESSION = o.STARTS_JOB_PROGRESSION,
VISIBLE_ON = o.VISIBLE_ON,
CAPTURE_INFO = o.CAPTURE_INFO,
COMMAND = o.COMMAND
}).ToList();

Update/Merge multiple rows with select statement data

Im trying to update a single table with output of a select statement which returns two values. One is the accountid that I need to update in the table, and the other is the information I need to update.
Here is my select statement
select CTP.CARETEAMPATIENTID, O.ORGANIZATIONID
from acts.careteampatient ctp,
ods.member m,
ods.supplierorganization so,
ods.MASTERSUPPLIERSUPPLIERRELATION mssr,
ods.INSURANCEORGSUPPLIERRELATION IOSR,
ods.INSURANCEORGANIZATION IO,
acts.organization o
where ctp.accountorgid is null
and m.primarymemberplanid = ctp.primarymemberplanid
and SO.AHMSUPPLIERID = M.AHMSUPPLIERID
and mssr.SUPPLIERID = so.SUPPLIERORGID
AND iosr.SUPPLIERID = so.SUPPLIERORGID
AND io.INSURANCEORGID = iosr.INSURANCEORGID
and io.processingmodecd = 'P'
and so.usagemnemonic = 'P'
and O.ODSACCOUNTID = IO.INSURANCEORGID
and O.ACCOUNTFLG = 'Y'
I want to do something along the lines of
update careteampatient
from (select CTP.CARETEAMPATIENTID patientid, O.ORGANIZATIONID orgid
from acts.careteampatient ctp,
ods.member m,
ods.supplierorganization so,
ods.MASTERSUPPLIERSUPPLIERRELATION mssr,
ods.INSURANCEORGSUPPLIERRELATION IOSR,
ods.INSURANCEORGANIZATION IO,
acts.organization o
where ctp.accountorgid is null
and m.primarymemberplanid = ctp.primarymemberplanid
and SO.AHMSUPPLIERID = M.AHMSUPPLIERID
and mssr.SUPPLIERID = so.SUPPLIERORGID
AND iosr.SUPPLIERID = so.SUPPLIERORGID
AND io.INSURANCEORGID = iosr.INSURANCEORGID
and io.processingmodecd = 'P'
and so.usagemnemonic = 'P'
and o.odsaccountid = io.insuranceorgid
and o.accountflg = 'Y') b
set a.accountorgid = b.orgid
where a.careteampatientid = b.patientid
Here is the Merge I also tried
merge into careteampatient a
using (select CTP.CARETEAMPATIENTID patientid, O.ORGANIZATIONID orgid
from acts.careteampatient ctp,
ods.member m,
ods.supplierorganization so,
ods.MASTERSUPPLIERSUPPLIERRELATION mssr,
ods.INSURANCEORGSUPPLIERRELATION IOSR,
ods.INSURANCEORGANIZATION IO,
acts.organization o
where ctp.accountorgid is null
and m.primarymemberplanid = ctp.primarymemberplanid
and SO.AHMSUPPLIERID = M.AHMSUPPLIERID
and mssr.SUPPLIERID = so.SUPPLIERORGID
AND iosr.SUPPLIERID = so.SUPPLIERORGID
AND io.INSURANCEORGID = iosr.INSURANCEORGID
and io.processingmodecd = 'P'
and so.usagemnemonic = 'P'
and o.odsaccountid = io.insuranceorgid
and o.accountflg = 'Y') b
on a.careteampatientid = b.patientid
when matched then
update
set a.accountorgid = b.orgid
This isnt working and Im fresh out of ideas, any help would be awesome. Thanks
Figured it out, I was missing brackets on my ON. It should be on (a.careteampatientid = b.patientid) also my select should read select distinct

Resources