JdbcTemplate ক্যোয়ারীফর্ট / লং বসন্ত ৩.২.২ এ অবমুক্ত করা হয়েছে। এটি কি দ্বারা প্রতিস্থাপন করা উচিত?


104

জেডিবিসিটিম্প্লেটে ক্যোরিফোর্স ইনটাইট / ক্যোরিফোর দীর্ঘ পদ্ধতিগুলি বসন্ত ৩.২ এ অবমুক্ত করা হয়েছে। এই পদ্ধতিগুলি ব্যবহার করে বিদ্যমান কোডটি প্রতিস্থাপনের জন্য কেন বা কোনটি সর্বোত্তম অনুশীলন হিসাবে বিবেচিত হয় তা আমি খুঁজে পাচ্ছি না।

একটি সাধারণ পদ্ধতি:

int rowCount = jscoreJdbcTemplate.queryForInt(
    "SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
    playerNameKey.toUpperCase(),
    teamNameKey.toUpperCase()
);

ঠিক আছে উপরের পদ্ধতিটি আবার নিম্নরূপ লেখা দরকার:

Object[] params = new Object[] { 
   playerNameKey.toUpperCase(), 
   teamNameKey.toUpperCase()
};
int rowCount = jscoreJdbcTemplate.queryForObject(
    "SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
    params, Integer.class);

স্পষ্টতই এই অবমূল্যায়নটি জেডিবিসিটিম্প্লেট শ্রেণিকে সহজ করে তোলে (বা এটি করে?) ক্যোয়ারিফোর্ড এটি সর্বদা একটি সুবিধার পদ্ধতি ছিল (আমার ধারণা) এবং এটি দীর্ঘ সময় ধরে রয়েছে। কেন এটি অপসারণ করা হয়েছে। কোডটি আরও জটিল হয়ে ওঠে ফলে।


এই বিশদটি অবহ্রাসিত
ড্যান

আপনি ঠিক বলেছেন, আমার উত্সটি কেন নেই তা আমি জানি না@Deprecated
সোতিরিওস ডেলিমনোলিস

স্প্রিং সংস্করণটি ৩.২.২ এ আপডেট করা হয়েছে - যেমনটি মনে হয় এটি এখানে প্রথম অবহিত করা হয়েছে
ড্যান ম্যাকবিয়ান

আমি বিদ্যমান কোডবেস 3.1 থেকে 3.2.2 থেকে আপগ্রেড করেছি এবং এই পদ্ধতিগুলি সমস্ত জায়গাতে ব্যবহৃত হয়। কোডটি কেন এবং কীভাবে আপডেট করবেন তা বুঝতে হবে।
ড্যান ম্যাকবিয়ান

সচেতন থাকুন যে ক্যুরিয়ারফোর্ড অবজেক্টটি ফিরে আসতে পারে null(আপনার উদাহরণের ক্ষেত্রে তা নয়)। ক্যোয়ারীফরেন্ট / লং থেকে নাল চেক কোডটি এখন নকল করা ছাড়া আমি অন্য কোনও উপায় খুঁজে পাই না।
hochraldo

উত্তর:


110

আমি যা মনে করি তা হ'ল যে কেউ বুঝতে পেরেছিল যে ক্যোয়ারীফোরইন্ট / লং পদ্ধতিতে বিভ্রান্তিকর শব্দার্থক শব্দ রয়েছে, অর্থাৎ জেডিবিসিটাইপ্লেট উত্স কোড থেকে আপনি এর বর্তমান বাস্তবায়ন দেখতে পাবেন:

@Deprecated
public int queryForInt(String sql, Object... args) throws DataAccessException {
    Number number = queryForObject(sql, args, Integer.class);
    return (number != null ? number.intValue() : 0);
}

যা আপনাকে ভাবতে পরিচালিত করতে পারে যে ফলাফলের সেটটি খালি থাকলে এটি 0 ফিরে আসবে, তবে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলে:

org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0

সুতরাং নিম্নলিখিত বাস্তবায়ন মূলত বর্তমানের সমতুল্য:

@Deprecated
public int queryForInt(String sql, Object... args) throws DataAccessException {
    return queryForObject(sql, args, Integer.class);
}

এবং তারপরে অবহেলিত কোডটি এখন কুৎসিতের সাথে প্রতিস্থাপন করতে হবে:

    queryForObject(sql, new Object { arg1, arg2, ...}, Integer.class);

বা এটি (সুন্দর):

    queryForObject(sql, Integer.class, arg1, arg2, ...);

12
এটা সত্য নয়। তৃতীয় কোড স্নিপেট বাস্তবায়নের সমান নয়! কারণ অটো আনবক্সিং সহ একটি লুকানো এনপিই রয়েছে। যদি আপনার কোয়েরিতে ফলাফলগুলি ফিরে আসে, তবে সেগুলি বাতিল হয়ে যায়, পূর্ববর্তী আচরণটি সঠিকভাবে পুনরুত্পাদন করার জন্য শূন্যের পরিবর্তে 0 ফিরে আসত, এটি হবে: পূর্ণসংখ্যার ফলাফল = ক্যোয়ারফোরঅবজেক্ট (এসকিউএল, আরগস, ইন্টিজার.ক্লাস); প্রত্যাবর্তন ফলাফল == নাল? 0: ফলাফল;
MetroidFan2002

@ মেট্রয়েডফ্যান ২০০২: সত্যই আপনার পর্যবেক্ষণ সত্য! তবে, এপিআই ডিজাইনের দৃষ্টিকোণ থেকে, যদি কোয়েরিটি কেবল একটি নূন্যমূল্য ফেরত দেয় তবে আমি বিশ্বাস করি যে এটি হিসাবে এনআরএল 0 এর সমতুল্য হওয়ার পরিবর্তে এটি হিসাবে ফিরে আসাই ভাল believe এপিআই ব্যবহারকারীর এই ধরণের শর্তগুলির মূল্যায়ন করতে।
গ্যাব্রিয়েল বেলিংগেরেস

সমস্যাটি হ'ল যদি এবং যখন কোনও ব্যবহারকারী সেখানে এনপিই পান, যদি না তারা তাদের পরিবেশে স্পষ্টভাবে কিছু নির্দিষ্ট জিনিস সেট আপ করে (উদাহরণস্বরূপ, অ্যাকোপিসের অটোবক্সিংয়ের ব্যবহারগুলি হাইলাইট করার বিকল্প রয়েছে), সেই লাইনে থাকা এনপিই জেডিবিসিপিআরেন্স উদাহরণগুলির মতো দেখাবে নাল আগে শূন্য ফিরিয়ে দেওয়া যেত। এখন আপনি কেন এমন প্রশ্নের মধ্যে এটি ব্যবহার করবেন যা নালার দিকে ফিরে আসে, আমার কোনও ধারণা নেই (এটি মূলত n00bs এটি করার কারণে হয়েছে, যা তারা করবে) তবে এগুলি সরিয়ে নেওয়া কোনও দুর্দান্ত পদক্ষেপ আইএমও নয়।
MetroidFan2002

আমি খুঁজে পেলাম একটি সম্ভাব্য কারণ হ'ল অসম্পূর্ণতার কারণে। আমার কাছে দীর্ঘ মূল্য ছিল 10000000233174211 ক্যোরিফোর্ডং (স্ট্রিং) দ্বারা ফিরিয়ে দেওয়া, তবে পরিবর্তে এটি 10000000233174212 অর্থাত্ +1 ফিরে আসছিল। আমি কোডটি দেখেছি এবং এটি একটি ডাবলকে লংকে রূপান্তরিত করে, তাই সম্ভবত রূপান্তরকরণে কোনও সমস্যা আছে।
এমসওয়াডেজ

কিছুটা উপরে আমার মন্তব্য সম্পর্কে চিন্তা করে, কলামের জন্য ডেটা টাইপ সংখ্যা ছিল (19,0), তাই সম্ভবত এই কারণেই ডাবল কার্যকর হয়েছে? আমি যেভাবে কোনওভাবে ক্যোয়ারফোর্ডঅবজেক্ট (এসকিউএল, লং.ক্লাস) ব্যবহার করে সমস্যাটি পেয়েছি।
মঙ্গলবার

35

আমি মূল পোস্টারটির সাথে একমত হই যা সুবিধা পদ্ধতি পদ্ধতির ক্যোয়ারীফরঙ্গলং (এসকিএল) হ্রাস করা কোনও অসুবিধা।

আমি স্প্রিং ৩.১ ব্যবহার করে একটি অ্যাপ্লিকেশন তৈরি করেছি এবং সবেমাত্র সর্বশেষতম স্প্রিং সংস্করণে (৩.২.৩) আপডেট করেছি এবং লক্ষ্য করেছি যে এটি হ্রাস পেয়েছে।

ভাগ্যক্রমে, এটি আমার জন্য এক লাইনের পরিবর্তন ছিল:

return jdbcTemplate.queryForLong(sql);  // deprecated in Spring 3.2.x

পরিবর্তিত হয়েছিল

return jdbcTemplate.queryForObject(sql, Long.class);

এবং কয়েকটি ইউনিট টেস্টগুলি মনে হয় যে উপরের পরিবর্তনটি কাজ করে।


ভাল যুক্তি. এটা খুব প্রথম বন্ধনী ছাড়া কাজ করবে। :)
এসজিবি

14

পক্ষে অবমূল্যায়িত queryForObject(String, Class)


13

এই জাতীয় কোড প্রতিস্থাপন:

long num = jdbcTemplate.queryForLong(sql);

এই কোড সহ:

long num = jdbcTemplate.queryForObject(sql, Long.class);

অত্যন্ত বিপজ্জনক কারণ যদি কলামে নাল মান জিজ্ঞাসা থাকে তবে অবজেক্ট রিটার্ন নাল হয় এবং আমরা জানি যে আদিম প্রকারগুলি নাল হতে পারে না এবং আপনার নালপয়েন্টার এক্সসেপশন হবে। সংকলক আপনাকে এ সম্পর্কে সতর্ক করে দেয় না। রানটাইমের সময় আপনি এই ত্রুটি সম্পর্কে জানবেন। আপনার যদি একই পদ্ধতি হয়ে থাকে তবে যদি আপনার এমন পদ্ধতি থাকে যা আদিম ধরণের ফেরত দেয়:

public long getValue(String sql) {
    return = jdbcTemplate.queryForObject(sql, Long.class);
}

বসন্ত 2.২.২ এ জেডিবিসিটিম্প্লেটে অবহিত পদ্ধতিটির জিজ্ঞাসার জন্য নীচের অংশটি রয়েছে:

@Deprecated
public long queryForLong(String sql) throws DataAccessException {
    Number number = queryForObject(sql, Long.class);
    return (number != null ? number.longValue() : 0);
}

আপনি দেখতে পারেন তারা আদিম মান ফেরত দেওয়ার আগে সেখানে পরীক্ষা করে দেখুন যে এটি নাল নয় এবং যদি এটি নাল হয় তবে তারা 0 ফিরে আসে way উপায় দ্বারা - 0 এল হওয়া উচিত।


3
2 সেন্ট: আপনি যদি অটোবক্সিং সতর্কতা সক্ষম করে থাকেন তবে সংকলক আপনাকে এটি সম্পর্কে সতর্ক করতে পারে।
কেইকি

আমি এটা সম্পর্কে জানতাম না।
সাথীদের

2

JdbcTemplate#queryForIntযদি কলামের মানটি এসকিউএল নুল বা 0 হয় তবে 0 প্রদান করে the আমি মনে করি এই পদ্ধতিটি অবমূল্যায়নের মূল কারণ। বিটিডব্লিউ, ResultSet#getIntএকইভাবে আচরণ করে। যদিও আমরা এই দুটি ক্ষেত্রে এর মধ্যে পার্থক্য করতে পারি ResultSet#wasNull


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.